当前位置: 首页 > news >正文

mysql中You can’t specify target table for update in FROM clause错误

mysql中You can’t specify target table for update in FROM clause错误

You cannot update a table and select directly from the same table in a subquery.

mysql官网中有这句话,我们不能在一个语句中先在子查询中从某张表查出一些值,再update这张表。

比如:

mysql> UPDATE items
SETretail = retail * 0.9
WHEREid IN (SELECTidFROMitemsWHEREretail / wholesale >= 1.3AND quantity > 100);

这个语句执行的时候会报错: ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause

针对这种报错,有两种方法解决:多表更新和中间表

方法一 多表更新

我们可以通过多表更新来解决这个问题,连表时一张表是实际要更新的表,另一长表是原来的子查询派生出来的表,我们使用别名引用派生表。比如上面的例子中的sql,可以改写成如下写法:

update items,
(SELECTidFROMitemsWHEREretail / wholesale >= 1.3AND quantity > 100
) a
setretail = items.retail * 0.9
whereitems.id = a.id

方法二 中间表

中间表的含义是将子查询再包一层,比如上面的语句可以改写成:

UPDATE items
SETretail = retail * 0.9
WHEREid IN (selectidfrom(SELECTidFROMitemsWHEREretail / wholesale >= 1.3AND quantity > 100) aa);

需要注意的是,mysql优化器可能会优化子查询,这时候仍然会抛出错误。我们可以使用optimizer_switch变量关闭这种行为;

#将derived_merge标志设置为off
SET optimizer_switch='derived_merge=off';

derived_merge是MySQL中的查询优化技术之一,用于控制派生表合并(derived merge)优化的行为。 在MySQL中,当执行复杂的查询时,可能会涉及到派生表,即在查询中使用子查询作为临时表。派生表合并是一种优化技术,它尝试将多个派生表合并为一个更简单的查询结构,以提高查询性能

参考: https://fanyi.youdao.com/index.html#/ https://dev.mysql.com/doc/refman/8.0/en/update.html

图片

                                                        点个“赞 or 在看” 你最好看!

                                                                喜欢,就关注我吧!

图片

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android SurfaceFlinger——GraphicBuffer内存申请(三十)
  • 基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码
  • 从json到protobuf,接口效率的提升
  • 领略诗词之妙,发觉生活之美。
  • 机器学习课程学习周报五
  • 初学Mybatis之 Lombok 篇
  • 微信小程序安装vant组件库和使用
  • Python3网络爬虫开发实战(6)异步爬虫
  • 速盾:cdn加速能不能防御攻击?
  • 掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了
  • 02 Redis安装与启动
  • 【c++刷题笔记-图论】day52: 101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
  • C# 多线程Paralle使用
  • LangChain4j-RAG高级-核心概念
  • 区块链——代码格式检查(prettier、solhint)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • angular2开源库收集
  • CSS 提示工具(Tooltip)
  • css布局,左右固定中间自适应实现
  • DataBase in Android
  • happypack两次报错的问题
  • HTTP 简介
  • JavaScript创建对象的四种方式
  • NSTimer学习笔记
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpringBoot几种定时任务的实现方式
  • Vue 重置组件到初始状态
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # 职场生活之道:善于团结
  • #数据结构 笔记三
  • (02)vite环境变量配置
  • (9)STL算法之逆转旋转
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (算法)Game
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转载)虚函数剖析
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net dataexcel winform控件 更新 日志
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NetCore发布到IIS
  • .NET导入Excel数据
  • /etc/fstab 只读无法修改的解决办法
  • @Bean, @Component, @Configuration简析
  • [ A*实现 ] C++,矩阵地图
  • [Angular 基础] - 指令(directives)
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)