今天在写 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 都是同一个表。致此问题得到完美解决。
分享到:
相关推荐
错误消息"You can't specify target table 'wms_cabinet_form' for update in FROM clause"清楚地指出,在同一个UPDATE语句中,你不能先从`wms_cabinet_form`表中选择一些值,然后立即更新这个表。 在原始的UPDATE...
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。这个错误通常发生在尝试在一个`UPDATE`语句的`FROM`子句中直接引用目标更新表时。MySQL不支持...
在MySQL数据库中,"You can’t specify target table for update in FROM clause"是一个常见的错误提示,意味着在同一个SQL语句中,你不能直接在一个`UPDATE`或`DELETE`语句的`FROM`子句中引用你想要更新或删除的表...
在MySQL数据库中,错误代码1093 - "You can’t specify target table ‘t’ for update in FROM clause" 是一个常见的错误,它通常发生在尝试在一个`UPDATE`语句的`FROM`子句中直接引用要更新的目标表时。...
### MySQL中“You can’t specify target table for update in FROM clause”错误解决方法 在MySQL数据库管理过程中,遇到SQL语法错误是家常便饭,其中一种较为常见的错误是“You can’t specify target table for ...
...
在平常的项目中,经常会碰到这样的问题:我需要在一张标中同时更新和查询出来的...结果却报错,报错信息为:You can't specify target table 'tb_test' for update in FROM clause,不能在同一语句中update,select同
最近工作中遇到一个问题,在linux mount /dev/vdb 到 /home 分区时报错: # mount /dev/vdb /home mount: you must specify the filesystem type 先执行:mkfs.ext3 /dev/vdb # mkfs.ext3 /dev/vdb mke2fs 1.41.12...
本算法的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 -----------...
在Verilog HDL(硬件描述语言)中,`specify`语句是一个强大的特性,用于描述电路中的延迟和互连关系。它允许设计者在不改变底层逻辑的情况下,指定电路的时序行为,这对于理解、分析和优化数字系统至关重要。在标题...
Protel DXP 提供了一些高级的编辑技巧用于满足设计的需要,主要包括放置文字、放置焊盘、放置过孔和放置填充等组件放置,以及包地、补泪滴、敷铜等 PCB 编辑技巧。生成Gerber文件和钻孔文件的一般步骤 。
导致了`java.sql.SQLException: You can’t specify target table ‘chat_messages’ for update in FROM clause`的错误。为了解决这个问题,我们需要对查询部分进行修改,确保它不直接引用正在插入的表。 修正后的...
当你运行上述代码,MySQL会返回错误:`ERROR 1093 (HY000): You can’t specify target table ‘apples’ for update in FROM clause.` 为了解决这个问题,你可以采用一种巧妙的技巧,即嵌套`SELECT`查询。通过创建...
- **SHOW GLOBAL VARIABLES**:这是一个MySQL命令,用于显示服务器级别的变量及其当前值。通过对比默认值,可以发现哪些变量被设置了非默认值。 - **INFORMATION_SCHEMA.GLOBAL_VARIABLES**:这是一个系统表,包含了...