postgresql ON CONFLICT ON CONSTRAINT 用于 2 个约束

Posted

技术标签:

【中文标题】postgresql ON CONFLICT ON CONSTRAINT 用于 2 个约束【英文标题】:postgresql ON CONFLICT ON CONSTRAINT for 2 constraints 【发布时间】: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

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

【问题讨论】:

见这里:***.com/questions/35888012/… 这能回答你的问题吗? Use multiple conflict_target in ON CONFLICT clause 【参考方案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 上。

以上是关于postgresql ON CONFLICT ON CONSTRAINT 用于 2 个约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中使用 RETURNING 和 ON CONFLICT?

Postgresql insert on conflict笔记

PostgreSQL INSERT ON CONFLICT UPDATE (upsert) 使用所有排除值

Postgresql EXCLUDE 约束在 INSERT 时未触发 ON CONFLICT

如何在 flask_sqlalchemy 中使用 PostgreSQL 的“INSERT...ON CONFLICT”(UPSERT)功能?

Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值