在同一個表上,刪除查詢出來的結果

背景

有一個程式設計師員工表(code_user),包含用戶id、姓名、掌握的語言。

表數據如下:

+---------+-----------+----------+
| user_id | user_name | language |
+---------+-----------+----------+
|       1 | zs        | js       |
|       2 | ls        | js       |
|       3 | ww        | js       |
|       4 | mwf       | java     |
|       5 | ergou     | java     |
|       6 | sanliuzi  | java     |
+---------+-----------+----------+

現在公司裁掉了所有的java渣渣,要在員工表中刪除對應的數據。

delete from code_user where user_id in (
	select user_id from code_user where language = "java"
);

執行sql,發現報錯。

ERROR 1093 (HY000): You can't specify target table 'code_user' for update in FROM clause

mysql不允許對一張表同時進行查詢和更新。那怎麼辦呢?

解決方案

delete from code_user where user_id in (
	select user_id from (
		select user_id from code_user where language = "java"
	) as tmp
);

執行sql,是可以刪成功的。

既然不允許對一張表同時進行查詢和更新,那就變成對兩個表進行查詢和更新。

上述語句就是將查詢結果生成一個派生表,然後對派生表進行查詢,然後對原表進行刪除,就ok了。

Tags: