博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】一条删除本表 id 最大的记录的 sql 语句,此时会先查询出本条的最大 id ,然后执行 delete ,而 mysql 中会对 select 子查询做限制,本文就此问题进行讲解说明。
场景一:
delete from test where id in (select max(id) from test);
[Err] 1093 - You can't specify target table 'test' for update in FROM clause
delete from test where id = (select max(id) from test);
[Err] 1093 - You can't specify target table 'test' for update in FROM clause
问题描述:如果子查询的 from 子句和更新(update)、删除(delete)对象操作的是同一张表,会出现上述报错。
解决办法:通过给 from 子句中的查询结果起别名。
正确语句:
delete from test where id in (select max_id from (select max(id) as max_id from test) as t);
场景二:
delete from test as t where t.id = 1;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as t where t.id = 1' at line 1
问题描述:在 delete from table 这样的语句中 table 不能使别名。
解决办法:去掉 delete 语句中的别名。
正确语句:
delete from test where id = 1;
小 tip (提示):
mysql 的别名可以大致分为 4 种:
字段别名、表别名、函数的结果别名(min()、max())、查询出来的结果起别名;
别名的写法是:要起别名的对象 as 别名(当然也可以去掉 as,不过推荐尽量使用别名)。
参考如下:
# 字段别名:
select name as '姓名' from table;
# 表别名:
select name from table as t where t.id = 1;
# 函数结果别名:
select max(id) as max_id from table;
# 查询的结果别名:
select t.name from (select id,name from table) as t;
版权归 马富天PHP博客 所有
本文标题:《MySQL 中 delete 语句中的子查询限制》
本文链接地址:http://www.mafutian.net/430.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
这是最后一篇文章
第 3 楼 repostone 2019-10-18 16:59:52 暂无分享
第 2 楼 repostone 2019-10-18 16:59:06 暂无分享
第 1 楼 mf 2019-10-18 10:02:46 暂无分享
评论审核未开启 |