PostgreSQL一对一关系主表切换:UPDATE JOIN语句异常排查
解决方案
问题出在你写的UPDATE语句没有将待更新的main表与FROM子句中的关联表正确绑定,导致所有行都被匹配到唯一的sub记录,从而全量更新。以下是两种正确的写法:
方法一:使用FROM+WHERE关联更新
UPDATE main SET sub_id = s.id FROM sub s WHERE main.id = s.main_id;
这种写法通过WHERE子句明确关联main表的id和sub表的main_id,只有匹配的行才会被更新,未匹配的行sub_id保持原有null值。
方法二:使用关联子查询更新
UPDATE main SET sub_id = ( SELECT s.id FROM sub s WHERE s.main_id = main.id );
关联子查询会针对main表的每一行,去sub表中查找对应main_id的记录,找到则赋值,找不到则保持null,完全符合一对一关系的更新需求。
执行任意一种语句后,main表的结果都会符合预期:
| id | sub_id |
| 1 | 1 |
| 2 | null |
| 3 | null |
内容的提问来源于stack exchange,提问作者stefan.stt
相关产品推荐
相关产品推荐

