【问题标题】:postgresql ON CONFLICT ON CONSTRAINT for 2 constraintspostgresql ON CONFLICT ON CONSTRAINT 用于 2 个约束
【发布时间】:2016-05-06 21:48:01
【问题描述】:

我目前正在使用 PostgreSQL 9.5,想知道是否有可能在 ON CONFLICT ON CONSTRAINT 语句中包含 2 个约束的名称。我的sql在下面

INSERT INTO LIVE.TABLE (column1, column2, column3)
SELECT DISTINCT ON (cloumn1) column1, column2, column3
FROM STAGE.TABLE
​ON CONFLICT ON CONSTRAINT live.table.pkey DO NOTHING

这很好用,但是我想做的是在 ON CONFLICT ON CONSTRAINT 语句中包含第二个约束。我尝试了以下选项,但它似乎对我不起作用。

INSERT INTO LIVE.TABLE (column1, column2, column3)
SELECT DISTINCT ON (cloumn1) column1, column2, column3
FROM STAGE.TABLE
​ON CONFLICT ON CONSTRAINT live.table.pkey, live.table.fkey1 DO NOTHING

任何建议都将受到高度赞赏。

【问题讨论】:

标签: postgresql sql-insert upsert


【解决方案1】:

似乎你不能像这样附加两个约束名称

ON CONFLICT ON CONSTRAINT live.table.pkey, live.table.fkey1 DO NOTHING

但你可以

  • ON CONFLICT ( col1, col2 ) DO NOTHING.

或

  • ON CONFLICT DO NOTHING。

指定对哪些冲突 ON CONFLICT 采取替代操作 通过选择仲裁索引。要么执行唯一索引推断, 或显式命名约束。对于 ON CONFLICT DO NOTHING,它是 可选择指定一个冲突目标; 省略时,与冲突 处理所有可用的约束(和唯一索引)。对于开 CONFLICT DO UPDATE,必须提供一个冲突目标。

https://www.postgresql.org/docs/current/sql-insert.html#SQL-ON-CONFLICT

【讨论】:

    【解决方案2】:

    使用上面的列创建一个约束,例如,

    CONSTRAINT live_table_ukey UNIQUE(live.table.pkey, live.table.fkey1)
    

    然后在约束语句冲突时使用此键。

    【讨论】:

    • 这可能适用于 OP(信息不足),但这与具有两个唯一约束不同,一个在 pkey 上,另一个在 fkey1 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2016-01-23
    • 1970-01-01
    • 2022-01-23
    • 2021-09-17
    相关资源
    最近更新 更多