比如我要将用户表里名字(name)为空字符串("")的用户的状态(status)改成"1",
我的写的SQL如下:
UPDATE user_info SET STATUS = '1' WHERE USER_ID IN (SELECT USER_ID FROM user_info WHERE NAME != '');
但是报了如下错误:
You can't specify target table 'user_info' for update in FROM clause
因为在MYSQL里,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录,
解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,
这个问题只出现于mysql,mssql和oracle不会出现此问题。
所以只要将语句做如下修改即可:
UPDATE user_info SET STATUS = '1' WHERE USER_ID IN
(SELECT USER_ID FROM (SELECT USER_ID FROM user_info WHERE NAME != '') t1);
语句拆分解析:
1,将以下查询结果作为中间表,
SELECT USER_ID FROM user_info WHERE NAME != ''
2,再查询一遍中间表作为结果集:
SELECT USER_ID FROM (SELECT USER_ID FROM user_info WHERE NAME != '') t1
3,更新数据

本文介绍了一种在MySQL中更新特定记录时遇到的错误及其解决方案。当尝试在一个查询中同时选择和更新同一张表时,会出现错误。文章提供了一个通过创建中间表来绕过该限制的方法。
1581

被折叠的 条评论
为什么被折叠?



