修改 MySQL 一些数据的时候,update 同表子查询筛选的数据,出现了如下错误:
#1093 - You can't specify target table 'd_no' for update in FROM clause
原因:在 MySQL文档中已经详细的指明了该问题。优化器默认会合并 derived table (实际上是一种特殊的subquery,它位于SQL语句中FROM子句里面,可以看做是一个单独的表)到外边的查询块,仅当强制具体化 derived table 时,这才有效。
解决方法:前两种比较推荐,不推荐考虑第三种和第四种
1、包装子查询
update a set status=1 where id in (select * from (select id from a where status is null) as b)
2、将子查询移动到待更新列表中
update a as A ,(select id from a where status is null) as B set status=1 where A.id = B.id
3、 optimizer_switch 下的 derived_merge 设置为 off
4、
update /*+ NO_MERGE(a) */ a set status=1 where id in (select id from a where status is null)
5、直接重写子查询,