Mysql中如何解决You can't specify target table '表名' for update in FROM clause报错

我们在MySQL中编写SQL语句时,可能会遇到如下错误:

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

问题原因

例如下面这个SQL,其在执行时就会出现以上报错:

UPDATE users
SET sex = 1
WHERE id IN (
SELECT id FROM users 
WHERE realname = "小白" AND id > 2);

为什么会出现这个错误呢?这是因为在MySQL使用时,在同一条SQL语句中,不允许先SELECT出同一个表的某些值,再对该表进行UPDATE操作。

解决办法

方法一

为解决上面的问题,我们可以在SELECT时多嵌套一层子查询,即把SELECT出来的结果作为中间表再SELECT一次,修改后的SQL如下:

UPDATE users
SET sex = 1
WHERE id IN (
SELECT t.id FROM (
SELECT id FROM users 
WHERE realname = "小白" AND id > 2) t);

方法二

我们还可以创建一个新的临时表,然后根据临时表来UPDATE主表中的数据,最后再把临时表删除即可。

CREATE TABLE user_tmp AS SELECT id FROM users WHERE realname = "小白" AND id > 2;

UPDATE users SET sex = 1 WHERE id IN (SELECT id FROM user_tmp);

DROP TABLE user_tmp;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章