PostgreSQL中ON CONFLICT DO UPDATE更新所有字段语法问题咨询
解决PostgreSQL插入冲突时更新字段的问题
你的语句缺少两个关键部分:
- 必须在
ON CONFLICT后指定冲突的目标列(也就是作为主键的name) DO UPDATE后需要明确写出要更新的字段和对应的值
方法一:逐个指定字段更新
直接把除name外的字段对应到新传入的参数:
INSERT INTO playlists (name, filter, selection, clips) VALUES ($1, $2, $3, $4) ON CONFLICT (name) DO UPDATE SET filter = $2, selection = $3, clips = $4;
方法二:使用EXCLUDED简化写法
PostgreSQL提供EXCLUDED关键字,代表原本要插入的那条记录(也就是冲突时未插入的新数据),用它可以批量更新字段,避免重复写参数:
INSERT INTO playlists (name, filter, selection, clips) VALUES ($1, $2, $3, $4) ON CONFLICT (name) DO UPDATE SET filter = EXCLUDED.filter, selection = EXCLUDED.selection, clips = EXCLUDED.clips;
注意事项
name是主键,冲突时无需更新,因此SET语句只处理其他字段EXCLUDED写法更易维护,后续表结构变更时,只需调整INSERT的字段列表,更新部分无需重复修改参数位置
内容的提问来源于stack exchange,提问作者Joymaker
相关产品推荐
相关产品推荐

