【问题标题】:Postgres: on conflict with implicit conflict targetPostgres:关于与隐式冲突目标的冲突
【发布时间】:2019-08-15 23:42:20
【问题描述】:

用于插入的 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

但我得到一个错误:

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

为什么我必须提供一个相互矛盾的目标?如何提供主键或其他一些列?

【问题讨论】:

    标签: sql postgresql upsert


    【解决方案1】:

    是的,<em>conflict_target</em> 是可选的,但仅限于 DO NOTHING

    the documentation:

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

    【讨论】:

      【解决方案2】:

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

      您可以简单地指定列名:

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

      【讨论】:

      • 但这是主键的重复。我可以以某种方式在那里提供主键吗?或者我应该怎么做才能完全忽略冲突的目标?
      • 您可以使用 PK 约束名称。确保阅读doc 部分末尾的提示(警告)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2020-03-24
      • 2016-03-23
      • 2017-04-03
      • 2015-02-11
      • 2013-04-29
      相关资源
      最近更新 更多