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。谢谢你!好极了。谢谢你!