UPDATE子查询执行成功但数据未更新,请求协助排查原因
排查UPDATE语句执行成功但数据未更新的问题
针对你遇到的UPDATE语句执行成功但目标数据没变化的情况,我来帮你拆解可能的原因和解决方案:
可能的原因分析
- WHERE条件未匹配到任何行:这是最常见的情况。如果
mytable中不存在id = 1且view_date = '2018-5-21'的记录,UPDATE会返回"成功"但影响0行,自然看不到数据变化。 - 子查询返回结果异常:你的子查询
SELECT sum(row) FROM (SELECT * FROMmytable)AS mmc WHEREview_date= '2018-5-21'可能返回NULL,或者返回值和income字段的原有值完全一致:- 如果该日期下的
row字段全为NULL,或者没有匹配的记录,sum()会返回NULL。如果原income已经是NULL,更新后不会有变化; - 如果
row是字符串类型,MySQL会尝试将其转换为数值求和,若转换失败会当作0处理,若原income已经是0,也看不到变化。
- 如果该日期下的
- 冗余的嵌套子查询:你的子查询里套了
SELECT * FROM mytable作为派生表,这完全没必要,既不会改变逻辑,还可能增加额外的性能开销,但这不是数据未更新的直接原因。 - 日期格式问题:如果
view_date是DATE类型,'2018-5-21'这种不补零的格式可能存在解析风险,MySQL虽然大多能识别,但标准格式'2018-05-21'更稳妥。
排查与修正步骤
先验证WHERE条件是否匹配记录
执行这条查询,确认是否存在目标行:SELECT * FROM `mytable` WHERE id = 1 AND view_date = '2018-05-21';如果没有返回结果,说明条件有误,需要调整
id或view_date的值。验证子查询的返回结果
单独执行子查询,看返回的具体值:SELECT sum(`row`) FROM `mytable` WHERE view_date = '2018-05-21';- 如果返回NULL,可以用
COALESCE函数将其转换为0,避免设置income为NULL:SELECT COALESCE(sum(`row`), 0) FROM `mytable` WHERE view_date = '2018-05-21'; - 如果返回值和目标行的
income原有值相同,更新后自然看不到变化。
- 如果返回NULL,可以用
使用简化后的UPDATE语句
去掉冗余的嵌套子查询,同时处理可能的NULL情况:UPDATE `mytable` SET `income` = (SELECT COALESCE(sum(`row`), 0) FROM `mytable` WHERE view_date = '2018-05-21') WHERE id = 1 AND view_date = '2018-05-21';
内容的提问来源于stack exchange,提问作者Leo Su
相关产品推荐
相关产品推荐

