首页 > 解决方案 > Postgresql SQL 抛出不明确的列错误

问题描述

我的 Postgres 数据库中有下表

CREATE TABLE "public"."zuffs" 
(
 "hash" bigint NOT NULL,
 "zuff" BIGINT NOT NULL,
 "lat" INTEGER NOT NULL,
 "lng" INTEGER NOT NULL,
 "weather" INTEGER DEFAULT 0,
 "expires" INTEGER DEFAULT 0,
 "clients" INTEGER DEFAULT 0,
 CONSTRAINT "zuffs_hash" PRIMARY KEY ("hash")
) WITH (oids = false);

weather, expires & clients如果该行已经存在,我想向其中添加新行或更新列。为此,我让我的 PHP 脚本生成以下 SQL

INSERT INTO zuffs (hash,zuff,lat,lng,weather,expires)         
VALUES(5523216,14978310951341,4978,589,105906435,4380919) ON CONFLICT(hash) DO UPDATE SET 
weather = 105906435,expires = 4380919,clients = clients + 1;

失败并出现错误

错误:列引用“客户”不明确

我不明白为什么会发生这种情况。我希望这里有人可以解释

标签: postgresqlupsert

解决方案


在 UPDATE 部分中,您应该使用 EXCLUDED “行”来引用这些值。并且要引用现有值,您需要再次为该列添加前缀,以避免“排除”和“当前”值之间的歧义:

INSERT INTO zuffs (hash,zuff,lat,lng,weather,expires)         
VALUES (5523216,14978310951341,4978,589,105906435,4380919) 
ON CONFLICT(hash) DO UPDATE 
  SET weather = excluded.weather,
      expires = excluded.expires,
      clients = zuffs.clients + 1;

推荐阅读