【发布时间】:2018-09-27 18:10:06
【问题描述】:
我在尝试使用 PostgreSQL 执行 UPSERT 时遇到了我不理解的行为。文档似乎表明INSERT 语句的冲突目标 可以是索引表达式 或 约束名称。但是,当尝试引用约束名称时,我收到“列...不存在”错误。
我的第一次尝试是创建一个UNIQUE 索引,它适用于约束推断:
create table kv (key text, value text, extra text);
create unique index kv_key_value on kv(key, value);
insert into kv (key, value) values ('k1', 'v1');
-- this works:
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (key, value) do update set extra=excluded.extra;
-- this does not
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (kv_key_value) do update set extra=excluded.extra;
描述上表,我在“索引”下看到以下内容:
"kv_key_value" UNIQUE, btree (key, value)
我的第二次尝试是将唯一约束明确地放在创建表中:
create table kv (
key text,
value text,
extra text,
constraint kv_key_value unique(key, value));
描述上表,“Indexes:”的输出略有不同(上例中的“UNIQUE CONSTRAINT”与“UNIQUE”):
"kv_key_value" UNIQUE CONSTRAINT, btree (key, value)
但是我仍然无法将约束名称指定为冲突目标:
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (kv_key_value) do update set extra=excluded.extra;
ERROR: column "kv_key_value" does not exist
LINE 2: on conflict (kv_key_value) do update set extra=exclude...
我在这里误解了什么吗?我完全明白我可以使用等效表达式并依赖约束推断,但我想知道为什么当文档听起来应该时约束名称似乎不起作用?
【问题讨论】:
标签: sql postgresql upsert