mysql 为什么不能在同一个表上查询和更新详解数据库
2023-06-13 09:20:08 时间
情况1:
update table set x = (select y from table where id =1)
error 1093: you cant specify target table test for update in from clause
情况2:
通常采用的解决方案
update table set x = select * from (select y from table where id =1) t
原因的猜想
我们都知道,mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。
仔细观察情况1和情况2,差别就在于情况2将结果集放入临时表中;
基于差异和上述理论,我猜到的一种原因是,update时,会锁表,此时不能再select。所以第一个情况会报错。
如果将结果集包装一层,其实就是放入临时表,临时表不会上锁,所以,可以正常work。
反思
这个问题,是我在看《高性能mysql(第三版)》P232页,“同一个表上查询和更新”上想到的,虽然我知道结论,却不知道为什么,搜了很多资料,发现没人问到这个问题,高性能mysql(第三版)》也是简单的说了一下,所以只能通过推理和猜测来假设可能。困扰了1天多,想通后,那种身心通畅的感觉真是倍爽!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/3749.html
mysql 赞 (1)相关文章
- java怎么连接数据库mysql
- 浅析mysql中exists 与 in 的使用详解数据库
- Linux在线安装MySQL:快速简便步骤(linux在线安装mysql)
- 开启Java之门:访问MySQL数据库(java访问mysql数据库)
- 性约束MySQL实现多个字段唯一性约束(mysql多个字段唯一)
- 使用JDBC连接MySQL数据库(jdbc访问mysql)
- MySQL版本查看方法详解(mysql怎么查看版本)
- MySQL实现千万级数据集快速处理(mysql千万级数据)
- MySQL中默认的事务隔离级别研究(mysql默认事务隔离级别)
- 集从MySQL到字符集的转换(mysql转字符)
- MySQL中字段的自增功能操作(mysql字段的自增)
- 更新MySQL:从旧版本到新版本(更换mysql版本)
- MySQL中列出所有数据库的方法(mysql列出数据库)
- 称MySQL查询:查看表的字段名称(mysql查询表字段名)
- 协作MySQL多版本协作:提升数据库性能(mysql多版本)
- 25面试题,教你如何优化MySQL数据库(mysql优化面试题)
- Linux轻松连接MySQL数据库的步骤(linux连接mysql数据库)
- MySQL中in运算符让数据查询更灵活(mysql中in运算符)
- 如何将CSV文件快速导入MySQL数据库(csv怎么传mysql)
- MySQL中ID字段自增的实现方法(mysql中id字段自增)
- 实现asp与mysql之间的连接整合MySQL驱动解决方案(asp连接mysql驱动)
- 特性简介,详解数据库优势请注意,原本给出的关键字是mysql七大特性简介,字数已被更正为25字,因此标题也随之改变)
- 探究MySQL一行记录大小的重要性与优化技巧(mysql一行记录大小)
- MySQL解决数据重复问题一列去重(mysql 一列去重)
- 如何下载旧版本的MySQL(mysql下载以前的版本)
- MySQL怎样转义下划线详解MySQL下划线转义方法(mysql 下划线 转义)
- MySQL不满足再用什么数据库25字解锁数据库争霸赛(mysql 不满足 再)