MySQL执行UPDATE更新同列值触发1053错误的解决方案咨询
错误原因
你遇到的是MySQL特有的操作限制:执行UPDATE/DELETE语句时,不允许直接在子查询的FROM子句中引用正在被修改的目标表,避免读写同一份数据产生冲突,你贴的错误码属于手误,该报错对应的正确错误码为1093。
另外你原SQL还存在两处逻辑问题:
- 冗余的
INNER JOIN titles t2逻辑,同主键自连接没有实际作用 - 子查询内排序误用了外层表的
t.pubDate字段,而非子查询表的pubDate,就算没有语法错误也无法正确取到最新发布日期对应的price值
正确实现方案
方案1:子查询套派生表(写法简单兼容全场景)
把取最新price的逻辑再套一层SELECT,让MySQL将其识别为临时派生表,即可绕过同表引用限制:
UPDATE titles SET price = ( SELECT price FROM ( SELECT price FROM titles ORDER BY pubDate DESC LIMIT 1 ) AS temp_latest_price ) WHERE titleID = 1001;
方案2:JOIN关联更新(性能更优)
直接通过交叉join关联最新记录完成更新,不需要多层嵌套子查询,执行效率更高:
UPDATE titles t_target CROSS JOIN ( SELECT price FROM titles ORDER BY pubDate DESC LIMIT 1 ) t_latest SET t_target.price = t_latest.price WHERE t_target.titleID = 1001;
注意事项
- 如果存在多条pubDate相同的最新记录,
LIMIT 1会随机返回其中一条的price,如果你有明确的取值优先级,可以在ORDER BY后追加第二个排序规则,比如ORDER BY pubDate DESC, titleID DESC,保证取值可预期 - 执行更新前建议先执行查询确认最新price值是否符合预期,避免误操作:
SELECT price FROM titles ORDER BY pubDate DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者The Ultraempoleon
相关产品推荐
相关产品推荐

