Sql 插入中的列引用不明确。。。关于冲突,请更新

Sql 插入中的列引用不明确。。。关于冲突,请更新,sql,postgresql,upsert,Sql,Postgresql,Upsert,给出一张表格: CREATE TABLE IF NOT EXISTS test."TestCounter" ("id" TEXT PRIMARY KEY, "count" INTEGER); 如果记录已经存在,我想插入一条记录并增加计数器 插入测试。“测试计数器”(“id”) 值('id-0') 冲突时(“id”)是否更新 设置“计数”=(“计数”+1) 返回“计数” 目前我收到了以下错误: ERROR: column re

给出一张表格:

CREATE TABLE IF NOT EXISTS test."TestCounter" 
("id" TEXT PRIMARY KEY, 
 "count" INTEGER);
如果记录已经存在,我想插入一条记录并增加计数器

插入测试。“测试计数器”(“id”)
值('id-0')
冲突时(“id”)是否更新
设置“计数”=(“计数”+1)
返回“计数”
目前我收到了以下错误:

ERROR:  column reference "count" is ambiguous
LINE 4:  SET "count" = "count" + 1
                       ^
SQL state: 42702
Character: 107

您需要对该列进行表格限定,否则该列将不明确。
使用虚拟表名
excluded
引用输入行。但您可能希望引用目标列,因此请使用目标表的名称进行限定:

INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

请注意,特殊的
排除表
用于参考最初建议插入的值

虚拟输入表
excluded
中的单行包含目标表的所有列,即使未在
INSERT
VALUES
表达式的目标列列表中列出。因此,无论
count
是否明确针对,您遇到的歧义总是存在的

旁白:目标列列表中省略的列默认为各自的列
default
值,默认为
NULL
NULL
为默认列
default
)。也就是说,在您的设置中默认为
NULL
,在我下面改进的设置中默认为
1
。应用INSERT之前的行级触发器
(如果有)

但这两种情况都不适用于示例,因为它毕竟引用了目标列

值得注意的是,列名
count
的其他两个实例是明确的(因此不需要表限定),因为它们只能引用目标表

由于
NULL+1
仍为
NULL
而未定义列
count
,因此设置很容易中断。这种设置更有意义:

CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
在我的示例中也没有使用带引号的CaMeL案例名称。见:


您需要对该列进行表格限定,否则该列将不明确。
使用虚拟表名
excluded
引用输入行。但您可能希望引用目标列,因此请使用目标表的名称进行限定:

INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

请注意,特殊的
排除表
用于参考最初建议插入的值

虚拟输入表
excluded
中的单行包含目标表的所有列,即使未在
INSERT
VALUES
表达式的目标列列表中列出。因此,无论
count
是否明确针对,您遇到的歧义总是存在的

旁白:目标列列表中省略的列默认为各自的列
default
值,默认为
NULL
NULL
为默认列
default
)。也就是说,在您的设置中默认为
NULL
,在我下面改进的设置中默认为
1
。应用INSERT之前的行级触发器
(如果有)

但这两种情况都不适用于示例,因为它毕竟引用了目标列

值得注意的是,列名
count
的其他两个实例是明确的(因此不需要表限定),因为它们只能引用目标表

由于
NULL+1
仍为
NULL
而未定义列
count
,因此设置很容易中断。这种设置更有意义:

CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
在我的示例中也没有使用带引号的CaMeL案例名称。见:


尝试更换into@BeshambherChaukhwan:Postgres(或标准SQL)中没有“替换为”。哦,我的糟糕。请检查此答案@BeshambherChaukhwan:触发器也不能解决此问题,不需要,请参阅下面的答案。尝试替换into@BeshambherChaukhwan:Postgres(或标准SQL)中没有“替换为”。哦,我的糟糕。请检查这个答案@BeshambherChaukhwan:触发器也不能解决这个问题,也不需要,请看下面的答案。sweet。谢谢你!好极了。谢谢你!