今天在写 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 一个较特殊的问题:You can't specify target table 'wms_cabinet_form' for update in F
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_...
最近在工作中遇到了一个mysql错误提示1093:You can’t specify target table for update in FROM clause,后来通过查找相关的资料解决了这个问题,现在将解决的方法分享给大家,有需要的朋友们可以参考借鉴,下面来...
1093 – You can’t specify target table ‘t’ for update in FROM clause, Time: 0 前情提示: Mac OS10.14+MySQL8.0.18; centOS6.8final+MySQL5.6; 解决: 方法一:多嵌套一层。多来一层子查询 以上SQL修改...
主要介绍了mysql中You can’t specify target table for update in FROM clause错误解决方法,需要的朋友可以参考下
。。。
...
在平常的项目中,经常会碰到这样的问题:我需要在一张标中同时更新和查询出来的...结果却报错,报错信息为:You can't specify target table 'tb_test' for update in FROM clause,不能在同一语句中update,select同
_____ "] "HR Mgr: " " " "] "Purchasing " "_______________________" " " "[ "Mgr:__________________" "_ " " " "] "__ " "ADM " " " " "PMC " "Mgr:___________________" " " " "Sup:__________________" "_____...
本算法的linux版
pre-UAL syntax does not specify the "s" (flag update) in the opcodes for arithmetic operations involving the low set of registers (r0-r7). For example: pre-UAL Syntax | UAL Syntax ;Note -----------...
主要介绍了linux mount报错:you must specify the filesystem type的解决方法,文中给出了详细的解决方法示例,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
Protel DXP 提供了一些高级的编辑技巧用于满足设计的需要,主要包括放置文字、放置焊盘、放置过孔和放置填充等组件放置,以及包地、补泪滴、敷铜等 PCB 编辑技巧。生成Gerber文件和钻孔文件的一般步骤 。
Couldn't connect to server from the Internet. Perhaps direct connections are not allowed in the current network. To use proxy please check/specify these environment variables: - ...
用Verilog语言的specify语句编写实现路径延迟模块的程序
(b) the name of the table, the names of the table's attributes, the data types of the table's attributes, the formats of the table's attributes, and the maximum number of rows that the table can have...
by Walter Alden Tackett in _Genetic_Algorithms:_Proceedings_of_the_ Fifth_International_Conference_ (GA93), S. Forrest Ed., Morgan- Kaufman 1993 To participate in our on-line Internet e-mail forum ...