mysql: you can't specify target table 問題解決


首先創建一個表:

CREATE TABLE `t1` (
`id` INT(11) NULL DEFAULT NULL,
`name` VARCHAR(20) NULL DEFAULT NULL
)

插入幾條數據:

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
|    2 | li   |
|    3 | huan |
+------+------+
3 rows in set (0.00 sec)

 

需求1:刪除最大id的那條記錄,於是我們會大約寫出如下的語句:

mysql> delete from t1 where id=(select max(id) from t1);
ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause
很不幸,它報錯了.

可以修改成如下語句:

mysql> delete a from t1 a,(select max(id) maxid from t1) b where a.id=b.maxid;  
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
|    2 | li   |
+------+------+
2 rows in set (0.00 sec)

也可以是如下語句:

mysql> delete from t1 where id in ( select a.maxid from (select max(id) maxid from t1) a);  
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
+------+------+
1 row in set (0.00 sec)

 

需求2:插入一條記錄,並且id值是之前該表最大值加1,於是我們會大約寫出如下的語句:

mysql> insert into t1 values( (select max(id)+1 from t1),'you');
ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause
依舊報了同樣的錯誤

可以改寫如下:

mysql> insert into t1 select (select max(id)+1 maxid from t1 ) , 'you'; 
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
|    2 | you  |
+------+------+
2 rows in set (0.00 sec)

 

需求3:我們要更新一條語句,id需要變為之前最大值加1,於是我們會大約寫出如下的語句: 

mysql> update t1 set id=(select max(id)+1 from t1) where id=1;
ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause
錯誤如初

我們可以改寫為如下語句:

mysql> update t1,(select max(id)+1 as maxid from t1 ) a set id=a.maxid where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    3 | chen |
|    2 | you  |
+------+------+
2 rows in set (0.00 sec)

也可以改成如下語句:


mysql> update t1 set id=(select a.maxid from (select max(id)+1 maxid from t1) a) where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    4 | chen |
|    2 | you  |
+------+------+
2 rows in set (0.00 sec)

 

總的思路是:把查詢的最大值語句轉為subquery或derived。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM