You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多批量行INSERT ON CONFLICT时用COALESCE更新age字段的方法

解决多行Upsert时的字段更新问题

嗨,这个场景我之前处理过,刚好能帮到你!你用的是PostgreSQL的ON CONFLICT语法对吧?在多行批量插入遇到主键冲突时,要引用待插入行的对应字段,得用**EXCLUDED这个特殊的虚拟表**——它专门用来存放那些因为冲突没能插入成功的行的数据。

所以你要的SQL语句应该写成这样:

insert into obj (id, age) 
values (2, 42), (3, 43), (5, 60) 
on conflict (id) do update 
set age = coalesce(EXCLUDED.age, obj.age);

为什么这样写?

  • EXCLUDED.age会对应到当前冲突行里你原本要插入的age值,比如当id=2已经存在时,它就取42;如果是id=3冲突,就取43,完美适配多行的不同值。
  • coalesce(EXCLUDED.age, obj.age)的逻辑和你单条时完全一致:只有当待插入的age非空时,才用它更新原表的age,否则保留原字段的值。

另外补充一下,EXCLUDED表包含了你INSERT语句里指定的所有列,以后如果你的表加了其他字段,要做类似的批量upsert,直接用EXCLUDED.字段名就可以啦。

内容的提问来源于stack exchange,提问作者Tara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:31:35