SQL Upsert语句中DO UPDATE未更新目标记录问题排查求助
问题根因
你的SQL存在逻辑冲突:WHERE NOT EXISTS 子句会提前过滤掉所有临时表中core_id已经在主表存在的记录,最终进入INSERT环节的只有主表中不存在的新数据,完全不会触发ON CONFLICT的冲突更新逻辑,所以预期要更新的已存在记录不会产生任何变更。
修复方法
直接删除WHERE NOT EXISTS的过滤条件即可,冲突判断完全可以交给ON CONFLICT子句处理,修正后的SQL如下:
INSERT INTO main_table SELECT * FROM temp t ON CONFLICT (core_id) DO UPDATE SET project_urls = EXCLUDED.project_urls
其他可选排查方向
如果修改后仍未达到预期效果,可以检查以下几点:
- 确认主表的
core_id字段设置了主键约束或者唯一约束,否则ON CONFLICT (core_id)无法正确识别冲突场景 - 确认临时表中对应
core_id的project_urls值和主表现有值存在差异,如果两者完全相同,数据库不会产生实际的变更记录 - 检查主表是否存在更新触发器、行级安全策略等规则拦截了更新操作
内容的提问来源于stack exchange,提问作者L M
相关产品推荐
相关产品推荐

