PostgreSQL upsert语句中的多个on conflict怎么处理?

17

我在同一张表上有两个唯一约束条件,并且我想在该表上执行upsert语句。

是否可以在upsert中指定这两个冲突? 我看到了这个:如何在Postgres中upsert其中一个列的冲突?

但我的问题稍微复杂一些,因为其中一个唯一约束是另一个唯一约束的子集。 即

unique_constraint_1 =(col_1) unqiue_constraint_2 =(col_1,col_2)

INSERT INTO table (col_1, col_2, col_3) 
VALUES (val_1, val_2, val_3) 
ON CONFLICT (what do I put here to account for both constraints?) 
DO NOTHING; 

谢谢!


3
不幸的是,你不能这样做。你只能指定一个冲突(https://www.postgresql.org/docs/9.5/static/sql-insert.html)。 - wildplasser
5
自从这个问题被提出已经一年了,我也遇到了同样的问题。执行“UPSERT”操作失败,因为冲突发生在单一“ON CONFLICT”条件中没有考虑到的“UNIQUE”限制上。有什么改变吗?有任何解决方法吗? - Thalis K.
3
第二个限制条件难道不已经涵盖了第一个吗? - Int'l Man Of Coding Mystery
6
首先,如果col1是唯一的,那么同一张表中的col1、col2组合也将是唯一的。你不需要两个唯一约束条件。 只需删除第二个约束条件即可解决问题,并加快对该表的所有插入操作。 - Grzegorz Grabek
@GrzegorzGrabek 你能解释一下你的论点吗?假设我有一个 UserTable 和以下约束条件:
  • unique(first_name, last_name)
  • unique(city, street,number,last_name)
  • unique(id)
当使用 on conflict ( first_name, last_name), (city, street,number,last_name) ) 时,与你提出的 on conflict ( first_name,city, street,number,last_name) ) 的含义不同,如果我理解正确的话。注意:unique(id)未包含在on conflict子句中。
- claus
1个回答

2
根据文档ON CONFLICT默认涵盖所有独特的约束条件。
如果省略,则处理所有可用的约束条件(和唯一索引)的冲突。
在您的情况下,不需要两个约束条件,就像Grzegorz Grabek已经指出的那样。因为更严格的单列约束已经涵盖了更宽松的双列约束。

4
注意:这仅适用于 DO NOTHING 的 upserts,如果您使用 DO UPDATE,则必须指定冲突目标。 - Amit Assaraf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接