MySQL 8.0.43中更新语句因目标表在FROM子句中报错的解决方法咨询
MySQL 8.0.43中更新语句因目标表在FROM子句中报错的解决方法咨询
嗨,这个问题我之前处理过不少次,MySQL 8.0之后对自引用更新的语法限制更严格了,你碰到的1093错误就是因为不能在UPDATE的FROM子句里直接引用要更新的目标表。不过有几个简单的方案可以解决这个问题:
用派生表包装子查询
把原来的统计子查询嵌套成一个派生表,这样MySQL就不会识别为直接引用目标更新表了,语句就能正常执行:UPDATE `details_audit` a SET a.count_changes_below_100 = ( SELECT cnt FROM ( SELECT COUNT(*) AS cnt FROM `details_audit` WHERE sort_id < 100 ) AS sub );这里的核心是给内层的统计查询套了一层临时的派生表
sub,绕开了自引用的限制。使用JOIN方式更新
另一种更直观的方式是通过JOIN把统计结果和原表关联,再执行更新,这种写法在MySQL里也很常用:UPDATE `details_audit` a JOIN ( SELECT COUNT(*) AS cnt FROM `details_audit` WHERE sort_id < 100 ) AS sub SET a.count_changes_below_100 = sub.cnt;这种写法不仅能解决错误,可读性也更强,后续维护起来更方便。
先存统计值到变量再更新
因为你的需求看起来是给表中所有行都设置同一个统计值(子查询没有和主表的字段关联),所以还可以先把统计结果存到变量里,再批量更新:SET @cnt = (SELECT COUNT(*) FROM `details_audit` WHERE sort_id < 100); UPDATE `details_audit` SET count_changes_below_100 = @cnt;这个方法的优势是统计操作只执行一次,效率会更高,尤其是当表数据量很大的时候。
顺便提一句,旧版本MySQL能执行是因为当时的优化器对这类自引用语句的处理逻辑不同,8.0之后优化器的规则更严谨了,所以就触发了这个错误提示。
内容来源于stack exchange
相关产品推荐
相关产品推荐

