9

upsert当表中的两列之一发生冲突时,是否可以在 Postgres 9.5 中执行?基本上我有 2 列,如果任一列抛出唯一约束违规,那么我想执行更新操作。

4

2 回答 2

8

是的,这种行为是默认的。任何唯一的约束违反都构成冲突,然后UPDATE如果ON CONFLICT DO UPDATE指定则执行。该INSERT语句只能有一个ON CONFLICT子句,但该conflict_target子句的 可以指定多个列名,每个列名都必须有一个索引,例如UNIQUE约束。但是,您仅限于单个conflict_action,并且在处理该操作时您将无法获得有关哪个约束导致冲突的信息。如果您需要那种信息,或者根据违反约束的特定操作,您应该编写一个触发器函数,但这样您就失去了INSERT ... ON CONFLICT DO ...语句的最重要的原子性。

于 2016-01-27T08:28:38.227 回答
1

我认为在 Postgres 9.5 ON CONFLICT 中只能有一个约束或多个列名,但在该多个列上必须组合一个索引

于 2019-04-17T10:50:36.580 回答