Postgres:关于与隐式冲突目标的冲突

pio*_*rek 3 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)
)
Run Code Online (Sandbox Code Playgroud)

我想做

insert into candle values (...) 
    on conflict do update set
            v = 5
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

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

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

Lau*_*lbe 8

是的,conflict_target是可选的,但仅限于DO NOTHING.

根据文档

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


JGH*_*JGH 3

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

您可以简单地指定列名称:

insert into candle values (...) 
on conflict (e,m) do update set
  v = 5
Run Code Online (Sandbox Code Playgroud)