多个冲突目标

use*_*521 16 postgresql duplication upsert postgresql-10

我在列ab. 我需要这样的东西:

insert into my_table (a, b) values (1, 2), (1, 2)
on conflict (a) do update set c = 'a_violation'
on conflict (b) do update set c = 'b_violation'
Run Code Online (Sandbox Code Playgroud)

所以一般我想根据冲突目标进行不同的更新 - 不支持上面的语法(只支持一个on conflict语句)。有没有其他方法可以做到这一点?

Erw*_*ter 11

您的示例建议VALUES子句本身中有重复的行- 这将导致:

错误:ON CONFLICT DO UPDATE 命令不能再次影响行

可以通过折叠输入中的重复项来解决。看:

但是一个相关的问题会影响您的整体查询,这并不容易克服。

如果同一输入行触发多个唯一违规怎么办?
如果多个输入行触发相同的唯一违规怎么办?
如果多个输入行触发同一目标行的不同唯一违规,该怎么办?
以及它们的组合。

Postgres 开发人员可能不想打开这个蠕虫罐头,而是将 UPSERT 功能限制为单个约束。

ON CONFLICT DO NOTHING- 没有冲突目标 - 适用于任何适用的违规行为。变体的替代操作(“什么都不做”)是明确的。

您必须更加具体(还有关于并发性和可能的​​写入负载)才能获得更具体的答案。