mysql 出现You can't specify target table for update in FROM cl

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

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


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

创建表

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

插入数据

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

表结构及数据如下:

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

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

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

因为在同一个sql语句中,先select出message表中每个用户消息的最小id值,然后再更新message表,因此会出现 ERROR 1093 (HY000): 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 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 );Query OK, 4 rows affected (0.01 sec)Rows matched: 4  Changed: 4  Warnings: 0mysql> select * from message;+----+-----+-------------+---------------------+| id | uid | content     | addtime             |+----+-----+-------------+---------------------+|  1 |   1 | Hello World | 2016-09-26 00:00:01 ||  2 |   2 | Hello World | 2016-09-26 00:00:02 ||  3 |   3 | Hello World | 2016-09-26 00:00:03 ||  4 |   1 | content4    | 2016-09-26 00:00:04 ||  5 |   3 | content5    | 2016-09-26 00:00:05 ||  6 |   2 | content6    | 2016-09-26 00:00:06 ||  7 |   2 | content7    | 2016-09-26 00:00:07 ||  8 |   4 | Hello World | 2016-09-26 00:00:08 ||  9 |   4 | content9    | 2016-09-26 00:00:09 || 10 |   1 | content10   | 2016-09-26 00:00:10 |+----+-----+-------------+---------------------+10 rows in set (0.00 sec)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值