You can‘t specify target table for update in FROM clause

矫情吗;* 2024-02-19 10:37 171阅读 0赞

mysql出现You can’t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中,先select同一个表的某些值,然后再update这个表。

例如:message表保存了多个用户的消息

创建表

  1. CREATE TABLE `message` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `uid` int(10) unsigned NOT NULL,
  4. `content` varchar(255) NOT NULL,
  5. `addtime` datetime NOT NULL,
  6. PRIMARY KEY (`id`),
  7. KEY `uid` (`uid`),
  8. KEY `addtime` (`addtime`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

  1. insert into message(uid,content,addtime) values
  2. (1,'content1','2016-09-26 00:00:01'),
  3. (2,'content2','2016-09-26 00:00:02'),
  4. (3,'content3','2016-09-26 00:00:03'),
  5. (1,'content4','2016-09-26 00:00:04'),
  6. (3,'content5','2016-09-26 00:00:05'),
  7. (2,'content6','2016-09-26 00:00:06'),
  8. (2,'content7','2016-09-26 00:00:07'),
  9. (4,'content8','2016-09-26 00:00:08'),
  10. (4,'content9','2016-09-26 00:00:09'),
  11. (1,'content10','2016-09-26 00:00:10');

表结构及数据如下:

  1. mysql> select * from message;
  2. +----+-----+-----------+---------------------+
  3. | id | uid | content | addtime |
  4. +----+-----+-----------+---------------------+
  5. | 1 | 1 | content1 | 2016-09-26 00:00:01 |
  6. | 2 | 2 | content2 | 2016-09-26 00:00:02 |
  7. | 3 | 3 | content3 | 2016-09-26 00:00:03 |
  8. | 4 | 1 | content4 | 2016-09-26 00:00:04 |
  9. | 5 | 3 | content5 | 2016-09-26 00:00:05 |
  10. | 6 | 2 | content6 | 2016-09-26 00:00:06 |
  11. | 7 | 2 | content7 | 2016-09-26 00:00:07 |
  12. | 8 | 4 | content8 | 2016-09-26 00:00:08 |
  13. | 9 | 4 | content9 | 2016-09-26 00:00:09 |
  14. | 10 | 1 | content10 | 2016-09-26 00:00:10 |
  15. +----+-----+-----------+---------------------+
  16. 10 rows in set (0.00 sec)

然后执行将每个用户第一条消息的内容更新为Hello World

  1. mysql> update message set content='Hello World' where id in(select min(id) from message group by uid);
  2. ERROR 1093 (HY000): You can't specify target table 'message' for update in FROM clause

因为在同一个sql语句中,先select出message表中每个用户消息的最小id值,然后再更新message表,因此会出现这个错误。

  1. ERROR 1093 (HY000): You cant specify target table message for update in FROM clause

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

  1. update message set content='Hello World' where id in( select min_id from ( select min(id) as min_id from message group by uid) as a );

执行:

  1. mysql> update message set content='Hello World' where id in( select min_id from ( select min(id) as min_id from message group by uid) as a );
  2. Query OK, 4 rows affected (0.01 sec)
  3. Rows matched: 4 Changed: 4 Warnings: 0
  4. mysql> select * from message;
  5. +----+-----+-------------+---------------------+
  6. | id | uid | content | addtime |
  7. +----+-----+-------------+---------------------+
  8. | 1 | 1 | Hello World | 2016-09-26 00:00:01 |
  9. | 2 | 2 | Hello World | 2016-09-26 00:00:02 |
  10. | 3 | 3 | Hello World | 2016-09-26 00:00:03 |
  11. | 4 | 1 | content4 | 2016-09-26 00:00:04 |
  12. | 5 | 3 | content5 | 2016-09-26 00:00:05 |
  13. | 6 | 2 | content6 | 2016-09-26 00:00:06 |
  14. | 7 | 2 | content7 | 2016-09-26 00:00:07 |
  15. | 8 | 4 | Hello World | 2016-09-26 00:00:08 |
  16. | 9 | 4 | content9 | 2016-09-26 00:00:09 |
  17. | 10 | 1 | content10 | 2016-09-26 00:00:10 |
  18. +----+-----+-------------+---------------------+
  19. 10 rows in set (0.00 sec)

注意,只有mysql会有这个问题,mssql与oracle都没有这个问题。

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读