多批量行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
相关产品推荐
相关产品推荐

