代码之家  ›  专栏  ›  技术社区  ›  coleifer

PostgreSQL ON与多列唯一约束名称冲突

  •  1
  • coleifer  · 技术社区  · 6 年前

    UPSERT 使用PostgreSQL。文件似乎表明 冲突目标 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...
    

    我是不是误解了什么?我完全明白我可以使用等价的表达式并依赖于约束推理,但是我想知道为什么当文档使它听起来像应该的那样时,约束名称似乎不起作用?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Laurenz Albe    6 年前

    对于约束,应为:

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