You can't specify target table '表名' for update in FROM clause错误

比如我要将用户表里名字(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,日常问题记录)