【问题标题】:PostgreSQL ON CONFLICT with multi-column unique constraint name具有多列唯一约束名称的 PostgreSQL ON CONFLICT
【发布时间】: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


    【解决方案1】:

    你的语法错误。

    对于一个约束,它应该是:

    INSERT INTO kv (key, value, extra)
       VALUES ('k1', 'v1', 'e1')
       ON CONFLICT ON CONSTRAINT kv_key_value
          DO UPDATE SET extra = excluded.extra;
    

    【讨论】:

    • 非常感谢!
    • @gstackoverflow 使用其他语法,如文档所述。
    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 2017-01-27
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2013-12-16
    • 2014-12-16
    相关资源
    最近更新 更多