mysql 出现You can't specify target table for update in FROM clause错误的解决方法

2023-05-16

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 NULL,
 PRIMARY KEY (`id`),
 KEY `uid` (`uid`),
 KEY `addtime` (`addtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

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');

表结构及数据如下:

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)

然后执行将每个用户第一条消息的内容更新为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

因为在同一个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 );

执行:

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: 0

mysql> 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)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 出现You can't specify target table for update in FROM clause错误的解决方法 的相关文章

随机推荐

  • mysql互换表中两列数据方法

    1 创建表及记录用于测试 span class hljs operator span class hljs keyword CREATE span span class hljs keyword TABLE span span class
  • mysql 时间戳格式化函数from_unixtime使用说明

    我们一般使用字段类型int 11 时间戳来保存时间 xff0c 这样方便查询时提高效率 但这样有个缺点 xff0c 显示的时间戳 xff0c 很难知道真实日期时间 mysql提供了一个时间戳格式化函数from unixtime来转换格式 f
  • mysql函数concat与group_concat使用说明

    1 concat 函数 使用方法 xff1a concat str1 str2 返回的结果为连接参数产生的字符串 xff0c 如有任何一个参数为null xff0c 则返回值为null 注意 xff1a 如果所有参数均为非二进制字符串 xf
  • mysql innodb启动失败无法重启的处理方法

    电脑在使用过程中死机 xff0c 重启后发现mysql没有启动成功 xff0c 查看错误日志发现是innodb出现问题导致mysql启动失败 错误日志 mysql server start Starting MySQL ERROR The
  • mac环境使用sed修改文件出错的解决方法

    sed是linux命令 xff0c 用于处理文件内容 xff08 修改 xff0c 替换等 xff09 xff0c mac中都可以使用 xff0c 但发现相同的替换命令在linux可以正常执行 xff0c 在mac则执行失败 出错原因 用s
  • mysql order by rand() 效率优化方法

    从一次查询中随机返回一条数据 xff0c 一般使用mysql的order by rand 方法来实现 例如 从20万用户中随机抽取1个用户 span class hljs header mysql gt select from user o
  • 汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

    汇编语言 xff1a 冒泡排序算法 题目描述 自定义一组有首地址为data的10个字的数组 xff0c 请利用冒泡排序算法来编写程序 xff0c 使该数组中的数按照从小到大的次序有序化 xff08 注 xff1a 10个字可以自己定义 xf
  • 今天终于弄懂结构体数组与结构体变量的关系

    本人也是学计算机专业的 xff0c 但我是一个技术小白 xff0c 今年大一刚刚入学 xff0c 现在在过寒假 xff0c 因为我的C语言成绩并不太好 xff0c 父母总是为我感到担忧 xff0c 因此 xff0c 我每天都在敲代码 xff
  • MongoDB 导出导入备份恢复数据实例

    创建测试数据 创建db testdb collection user 插入10条记录 mongo MongoDB shell span class hljs property version span span class hljs num
  • crontab 使用日期时间命名重定向文件

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 例 xff1a 每天12点执行test php xff0c
  • php 使用redis锁限制并发访问类

    1 并发访问限制问题 对于一些需要限制同一个用户并发访问的场景 xff0c 如果用户并发请求多次 xff0c 而服务器处理没有加锁限制 xff0c 用户则可以多次请求成功 例如换领优惠券 xff0c 如果用户同一时间并发提交换领码 xff0
  • mysql导入大批量数据出现MySQL server has gone away的解决方法

    因工作需要 xff0c 需要导入一个200M左右的sql到user库 执行命令 mysql gt use user Database changed mysql gt span class hljs built in source span
  • mysql 搜寻附近N公里内数据的实例

    根据圆周率和地球半径系数以及搜寻点的经纬度 xff0c 搜寻数据表中与搜寻点之间的距离为N公里内的数据 1 创建测试表 span class hljs operator span class hljs keyword CREATE span
  • crontab 精确到执行分钟内某一秒执行的方法

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 执行指定命令默认是当前执行分钟的第0 1秒开始 例如 xf
  • mongodb 随机获取一条记录的方法

    原理 xff1a 1 先查询表中的记录总数 2 随机获取偏移量为0 总记录数 1 3 查询时skip偏移量 xff0c 再获取1条记录 因本人测试环境php已升级到7 0以上 xff0c mongodb扩展使用支持php7 0以上的扩展 x
  • mysql 连接闪断自动重连的方法

    使用php作为后台运行程序 xff08 例如短信群发 xff09 xff0c 在cli模式下执行php xff0c php需要连接mysql循环执行数据库处理 当mysql连接闪断时 xff0c 之后循环的执行将会失败 我们需要设计一个方法
  • mongodb 判断坐标是否在指定多边形区域内的方法

    MongoDB是一个基于分布式文件存储的数据库 xff0c 并提供创建基于地理空间的索引的能力 xff0c 本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用 1 使用百度拾取坐标工具 xff0c 在地图上定义多边形的坐
  • php 实现HTML实体编号与非ASCII字符串相互转换类

    HTML实体符号被用作实现保留字符 xff08 reserved characters xff09 或者表达键盘无法输入的一些常用字符 在大多数浏览器中默认的字符集为ISO 8859 1 HTML实体符号我们在网页设计中经常用到 例如 xf
  • 阿里云RAM账户日常问题总结

    什么是RAM RAM Resource Access Management 是阿里云为客户提供的用户身份管理与访问控制服务 使用RAM xff0c 您可以创建 管理用户账号 xff08 比如员工 系统或应用程序 xff09 xff0c 并可
  • mysql 出现You can't specify target table for update in FROM clause错误的解决方法

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