MySQL 8.0.31:更新外键时旧值被覆盖为Null的问题排查
问题原因及解决方法
- 核心问题:你的UPDATE语句没加WHERE子句限定更新范围,会修改
grid_location表的所有行。 - 错误逻辑拆解:
拿第二次执行的语句来说,遍历grid_location每一行时,只有grid_number=3的行能让子查询里的grid_location.grid_number=3条件成立,查到Angela的ID;其他行(包括之前设置好的grid_number=2的行)的子查询因条件不匹配返回空值,导致这些行的character_id被覆盖成Null。第一次执行时其实已经存在这个问题,只是你可能没注意到其他行的变化。 - 正确SQL写法:
第一次更新:
第二次更新:UPDATE grid_location SET character_id = ( SELECT character_id FROM `character` WHERE first_name = 'Andrew' AND last_name = 'Bernard' ) WHERE grid_number = 2;UPDATE grid_location SET character_id = ( SELECT character_id FROM `character` WHERE first_name = 'Angela' AND last_name = 'Martin' ) WHERE grid_number = 3; - 额外说明:这个问题和外键默认值、两表行数差异完全无关,纯粹是UPDATE语句的逻辑错误导致的。
内容的提问来源于stack exchange,提问作者JCam989
相关产品推荐
相关产品推荐

