实际存在的适用唯一规则裁决冲突。已有总额 5、建议总额 3 时,累加更新得到 8,替换则得到 3。合并策略由更新表达式决定。

INSERT ... ON CONFLICT 把竞态收进一条语句

INSERT … ON CONFLICT 让 PostgreSQL 在真正写入的语句内部处理插入冲突。它用明确的冲突策略和实际索引或约束,替代脆弱的“先查键是否存在,再决定插入”流程。但它不会把所有插入错误都变成更新成功,也不会替应用决定新旧数据应该如何合并。使用前,需要先确定唯一键和业务动作。 唯一规则选择冲突,更新表达式选择合并策略。空 RETURNING 结果与重试需要独立的调用方规则。 冲突目标定义处理范围 (name) 这样的目标,要求 PostgreSQL 推断匹配的唯一索引。表上必须实际存在适用的唯一性规则;写出 ON CONFLICT 并不会自动建立约束。如果键涉及表达式或部分索引,索引表达式和谓词也会影响匹配。目标没有匹配到索引时会报错,而不是悄悄改用另一种插入策略。可空业务键尤其需要注意:普通唯一索引把空值视为彼此不同,多次写入空键不一定冲突。若业务要求这些行相互冲突,应选择非空键,或明确采用符合需求的 NULLS NOT DISTINCT 语义。 DO UPDATE 必须指定目标,其裁决依据只能是受支持的非延迟唯一约束或唯一索引,排除约束不能作为 DO UPDATE 的冲突裁决依据。DO NOTHING 的处理范围更广,包括受支持的排除约束,也可以省略目标来处理适用的冲突规则。但这些能力都不会让外键、非空或检查约束失效,不能把它当成通用的错误忽略机制。 ...

三月 25, 2027 · 2 分钟 · XB Field Notes