【MySQL-Bug】MySQL 出现 You can‘t specify target table for update in FROM clause 错误的解决方法

【MySQL-Bug】MySQL 出现 You can't specify target table for update in FROM clause 错误的解决方法

  • 分析原因
  • 解决方法

分析原因

在 MySQL 中,可能会遇到 You can't specify target table '表名' for update in FROM clause 这样的错误

它的意思是说,不能在同一语句中,先 select 出同一表中的某些值,再 update 这个表,即不能依据某字段值做判断再来更新某字段的值。

这个问题在MySQL官网中有提到解决方案:MySQL-UPDATE- 拉到文档下面

例如下面这张 t_message

+----+-----+-----------+---------------------+
| id | uid | content   | addtime             |
+----+-----+-----------+---------------------+
|  1 |   1 | content1  | 2022-04-26 00:00:01 |
|  2 |   2 | content2  | 2022-04-26 00:00:02 |
|  3 |   3 | content3  | 2022-04-26 00:00:03 |
|  4 |   1 | content4  | 2022-04-26 00:00:04 |
|  5 |   3 | content5  | 2022-04-26 00:00:05 |
|  6 |   2 | content6  | 2022-04-26 00:00:06 |
|  7 |   2 | content7  | 2022-04-26 00:00:07 |
|  8 |   4 | content8  | 2022-04-26 00:00:08 |
|  9 |   4 | content9  | 2022-04-26 00:00:09 |
| 10 |   1 | content10 | 2022-04-26 00:00:10 |
+----+-----+-----------+---------------------+

我想将每个用户第一条消息的内容更新为 Hello World

UPDATE t_message 
SET content = 'Hello World' 
WHERE id IN ( 
			 SELECT min(id) FROM t_message GROUP BY uid 
			);

会出现下面错误:

ERROR 1093: You can't specify target table 't_message' for update in FROM clause

因为在同一个 sql 语句中,先 selectt_message 表中每个用户消息的最小 id 值,然后再更新 t_message 表,因此会出现 ERROR 1093 : You can’t specify target table ‘message’ for update in FROM clause 这个错误。

解决方法

解决方法:select 的结果再通过一个中间表 select 多一次,就可以避免这个错误。

UPDATE message 
SET content = 'Hello World' 
WHERE id IN ( 
			SELECT min_id FROM ( 
				  SELECT min(id) AS min_id FROM t_message GROUP BY uid 
								) AS a 
			);

你可能感兴趣的:(其他,mysql,bug,数据库)