MySQLSELECT同时UPDATE同一张表问题发生及解决
问题 解决 同时 发生 update 一张 mysqlselect
2023-06-13 09:14:48 时间
MySQL不允许SELECTFROM后面指向用作UPDATE的表,有时候让人纠结。当然,有比创建无休止的临时表更好的办法。本文解释如何UPDATE一张表,同时在查询子句中使用SELECT.
问题描述
假设我要UPDATE的表跟查询子句是同一张表,这样做有许多种原因,例如用统计数据更新表的字段(此时需要用group子句返回统计值),从某一条记录的字段update另一条记录,而不必使用非标准的语句,等等。举个例子:
复制代码代码如下:
问题描述
假设我要UPDATE的表跟查询子句是同一张表,这样做有许多种原因,例如用统计数据更新表的字段(此时需要用group子句返回统计值),从某一条记录的字段update另一条记录,而不必使用非标准的语句,等等。举个例子:
createtableapples(varietychar(10)primarykey,priceint);
insertintoapplesvalues("fuji",5),("gala",6);
updateapples
setprice=(selectpricefromappleswherevariety="gala")
wherevariety="fuji";
错误提示是:ERROR1093(HY000):Youcan"tspecifytargettable"apples"forupdateinFROMclause.MySQL手册UPDATEdocumentation这下面有说明:“Currently,youcannotupdateatableandselectfromthesametableinasubquery.”
在这个例子中,要解决问题也十分简单,但有时候不得不通过查询子句来update目标。好在我们有办法。
解决办法
既然MySQL是通过临时表来实现FROM子句里面的嵌套查询,那么把嵌套查询装进另外一个嵌套查询里,可使FROM子句查询和保存都是在临时表里进行,然后间接地在外围查询被引用。下面的语句是正确的:
updateapples
setprice=(
selectpricefrom(
select*fromapples
)asx
wherevariety="gala")
wherevariety="fuji";
如果你想了解更多其中的机制,请阅读MySQLInternalsManual相关章节。
没有解决的问题
一个常见的问题是,IN()子句优化废品,被重写成相关的嵌套查询,有时(往往?)造成性能低下。把嵌套查询装进另外一个嵌套查询里并不能阻止它重写成相关嵌套,除非我下狠招。这种情况下,最好用JOIN重构查询(rewritesuchaqueryasajoin)。
另一个没解决的问题是临时表被引用多次。“装进嵌套查询”的技巧无法解决这些问题,因为它们在编译时被创建,而上面讨论的update问题是在运行时。
相关文章
- 常量字符串的问题
- Kali更新源签名无效问题[通俗易懂]
- dos2unix命令解决 Shell 脚本无法执行的问题
- 【最新】解决Github网页上图片显示失败的问题
- AngularJS进阶(二)AngularJS路由问题解决
- CentOS 7 使用ror出现的问题
- DD_belatedPNG 与 unitpngfix 两种解决 IE6 中 PNG 图片透明问题方案横向对比
- 如何解决MongoDB空间不足问题(mongodb空间不足)
- 乱码解决Linux纯命令行中文乱码问题(linux纯命令行中文)
- 解决Linux网络问题的重启命令!(linux重启网络的命令)
- 缓存解决Redis与Java的缓存过期问题(redisjava过期)
- 时间解决Java中Redis设置过期时间的问题(redisjava过期)
- 解决MySQL数据库空间不足问题的有效方法(mysql数据库空间不足)
- 解决Oracle中文乱码问题的方法分享(oracle中文乱码)
- Redis实现精准解决匹配问题(redis匹配)
- Oracle审查长期卡住的问题(oracle关闭一直卡着)
- Redis秒杀解决并发扣款问题(并发扣款redis)
- 2003年MySQL常见问题的解决办法(2003mysql问题)
- 解决MySQL下载问题无法定位下载源(mysql下载时无法定位)
- 解决MySQL离线问题不联网也能轻松操作(mysql不联网怎么解决)
- 解决MySQL命令无法执行的问题(mysql不执行命令)
- 解决多机器环境下Redis单数据库布置问题(多redis单数据库)
- 解决Redis间断性连接断开问题(redis间断性连接断开)
- 苹果女员工再指控公司存在问题,曾因投诉性别歧视遭强制休假
- Tomcat+Jsp环境下的中文问题
- aspx服务器架设问题解决
- Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)