Postgres:与隐含的冲突目标发生冲突

问题描述 投票:0回答:2

Postgres 10和11规格插入说:

ON CONFLICT [conflict_target] conflict_action

我有一张桌子:

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

但是我收到一个错误:

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

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

sql postgresql upsert
2个回答
2
投票

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

您只需指定列名称:

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

1
投票

是的,conflict_target是可选的,但只有DO NOTHING

对于the documentation

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

© www.soinside.com 2019 - 2024. All rights reserved.