mysql the cabinet_mysql 一个较特殊的问题:You can’t specify target table ‘wms_cabinet_form’ | 很文博客...
mysql 一个较特殊的问题:You can't specify target table 'wms_cabinet_form' for update in F
今天在写 mysql 遇到一个比较特殊的问题。
mysql 语句如下:
update wms_cabinet_form set cabf_enabled=0
where cabf_id in (
SELECT wms_cabinet_form.cabf_id FROM wms_cabinet_form
Inner Join wms_cabinet ON wms_cabinet_form.cabf_cab_id = wms_cabinet.cab_id
Inner Join wms_cabinet_row ON wms_cabinet.cab_row_id =wms_cabinet_row.row_id
where wms_cabinet_row.row_site_id=27 and wms_cabinet_form.cabf_enabled=1)
运行时提出如下提示: You can't specify target table 'wms_cabinet_form' for update in FROM clause
运行 in 里面的 select 字句:
SELECT wms_cabinet_form.cabf_id FROM wms_cabinet_form
Inner Join wms_cabinet ON wms_cabinet_form.cabf_cab_id = wms_cabinet.cab_id
Inner Join wms_cabinet_row ON wms_cabinet.cab_row_id =wms_cabinet_row.row_id
where wms_cabinet_row.row_site_id=27 and wms_cabinet_form.cabf_enabled=1
可以正确 select 正确结果。再把结果直接写到 in 里面,改后语句如下:
update wms_cabinet_form set cabf_enabled=0 where cabf_id in ('113','114','115'),再运行可以正确执行更新。
到这一步开始想不明白,为什么用 select 子句运行会出错呢?以前在 mssql 这种写法是很常见的。
没办法了,唯有动用 baidu。找到两条记录。
原来原因是:mysql中不能这么用。 (等待mysql升级吧)。那串英文错误提示就是说,不能先select出同一表中的某些值,
再update这个表(在同一语句中)。 也找到替代方案,重写改写了 sql 。
改写后的 sql 如下所示,大家仔细区别一下。
update wms_cabinet_form set cabf_enabled=0 where cabf_id in (
SELECT a.cabf_id FROM (select tmp.* from wms_cabinet_form tmp) a
Inner Join wms_cabinet b ON a.cabf_cab_id = b.cab_id
Inner Join wms_cabinet_row c ON b.cab_row_id = c.row_id
where c.row_site_id=29 and a.cabf_enabled=1)
重点在 SELECT a.cabf_id FROM (select tmp.* from wms_cabinet_form tmp) a ,我 select tmp.* from wms_cabinet_form tmp 作为子集,
然后再 select a.cabf_id FROM 子集,这样就不会 select 和 update 都是同一个表。致此问题得到完美解决。
mysql the cabinet_mysql 一个较特殊的问题:You can’t specify target table ‘wms_cabinet_form’ | 很文博客...相关推荐
- mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...
- datax 导入数据中文乱码_四种方法处理MYSQL导入中文数据时的乱码问题 | 很文博客...
我是用的最后一种方法,前面三种解决MYSQL导入数据乱码的方法没试过,很文博客推荐大家直接使用第四种方法处理MYSQL导入中文数据时的乱码问题. 首先在新建数据库时一定要注意生成原数据库相同的编码形式 ...
- linux mysql 不稳定_Linux服务器mysql数据库自动停止的解决方法 | 很文博客
最近网站更换服务器,由原来的虚拟主机换成centos服务器,配置好后运行了半个月,各种折腾,也是一边学习一边捣鼓各种功能,随着访问量增大,这两天出现mysql数据库自动停止.只要稍微流量大一点,就会出 ...
- mysql show命令用不了_MySQL show命令的用法 | 很文博客
show tables或show tables from database_name; // 显示当前数据库中所有表的名称 show databases; // 显示mysql中所有数据库的名称 sh ...
- mysql 字符串转时间yymmdd_mysql 日期和时间格式转换实现语句 | 很文博客
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...
- mysql 恢复数据库 source_mysql数据库备份及恢复命令 mysqldump,source的用法 | 很文博客...
mysql数据库备份及恢复命令 mysqldump,source的用法,需要的朋友可以参考下. 还原一个数据库:mysql -h localhost -u root -p123456 www d:\w ...
- mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客
不常用:MySQL中的LOCATE和POSITION函数 LOCATE(substr,str) POSITION(substr IN str) 返回子串 substr 在字符串 str 中第一次出现的 ...
- mysql 自增语句_Mysql 自动增加设定基值的语句 | 很文博客
有时候需要为自动增加的字段设置基值,用下面的语句即可. 核心代码: ALTER TABLE 表名 AUTO_INCREMENT = 设定的值 MySQL ALTER语法中ALTER [IGNORE] ...
- mysql myisam 优化,mysql myisam 优化设置 | 很文博客
mysql myisam 优化设置设置,需要的朋友可以参考下. myisam_max_[extra]_sort_file_size足够大 delay_key_write减少io,提高写入性能 bulk ...
- mysql truncate drop_详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始 | 很文博客...
不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该 ...
最新文章
- go package学习——os
- python入门自学-你是如何自学 Python 的?
- python3安装哪个版本-python2和python3哪个版本新
- 用户控件(.ascx)调用网页(.aspx)的方法
- Python遍历字典的方法
- Unity-Animator深入系列---控制IK
- 拼凑 牛客练习赛70
- WMI介绍和应用查询硬件信息(硬盘信息、主板信息、BIOS信息、显示器信息、网络适配器、CPU信息)
- 1-AII--BroadcastReceiver广播的静态注册与动态注册
- Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(6) - 64位RFLAGS
- MySQL高级-MySQL并发参数调整
- l2-004 这是二叉搜索树吗?_MySQL索引为何选择B+树
- [转]CellCtrl控件完美破解研究
- CLRvia3读书笔记
- 新系统软件著作权申请流程及注意事项
- 信号检测与估计理论 pdf_目标检测的性能上界讨论
- Mysql必知必会概要总结
- python修改散点图中点的颜色_更改matplotlib中散点图点的颜色
- python3 下载.m3u8, 合并视频.ts 文件并合成为mp4格式的视频
- 处理window11无法连接网络共享打印机