Postgres:与隐式冲突目标发生冲突时

时间:2019-03-25 16:51:04

标签: sql postgresql upsert

用于插入的Postgres 10和11规范说:

  

ON CONFLICT [冲突目标]冲突行动

我有一张桌子:

create table c (
    e text not null,
    m text not null,
    v numeric not null,
    PRIMARY KEY (e, m)
)

我想做

insert into candle values (...) 
    on conflict do update set
            v = 5

但是我得到一个错误:

  

在CONFLICT DO UPDATE上需要推理规范或约束名称     提示:例如,ON CONFLICT(column_name)

为什么我必须提供一个冲突目标?如何提供主键或其他一组列?

2 个答案:

答案 0 :(得分:2)

您可能有多个约束,因此有多个替代操作。

您只需指定列名:

insert into candle values (...) 
on conflict (e,m) do update set
  v = 5

答案 1 :(得分:1)

是的,conflict_target是可选的,但只能与DO NOTHING一起使用。

the documentation

  

对于ON CONFLICT DO NOTHING,可以选择指定conflict_target;如果省略,则处理与所有可用约束(和唯一索引)的冲突。对于ON CONFLICT DO UPDATE,必须提供conflict_target