比如我要将用户表里名字(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,更新数据