举栗子:

delete from ta where id in (select max(id) from ta)

上述语句报错:

[Err] 1093 - You can't specify target table 'ta' for update in FROM clause

这是因为:在 mysql 中,不能先 select 一个表的记录,在按此条件进行更新和删除同一个表的记录。


正确用法:

delete from ta where id in (select uid from (select max(id) uid from ta) tb)

上述语句解决办法是:将select得到的结果,再通过中间表select一遍,这样就规避了错误。


关键点:

1、查询结果集的字段必须有别名,上例为 uid

2、查询结果集作为新表必须有别名,上例为 tb

3、再次查询所用的中间表 select 必须用之前起的字段别名,上例为 uid


注意:这个问题只出现于mysql,oracle不会出现此问题。


其它好文参考阅读:

https://blog.csdn.net/znb769525443/article/details/48245277