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)功能?