MySQL更新报错:无法在FROM子句指定目标表,求解决方案
解决MySQL更新时“不能在FROM子句中指定目标表”的问题
这个坑我之前踩过!MySQL有个限制:不能在更新某张表的同时,直接在FROM子句里引用这张表本身——它在处理这类语句时,会因为临时表的生成和引用顺序冲突而报错。而且你的原SQL还有个隐藏问题:子查询没有和更新的行做关联,执行起来会返回多行结果,大概率还会触发“Subquery returns more than 1 row”的报错,得一起解决。
给你两种靠谱的解决方案:
方案1:用嵌套子查询包装成派生表
把原来的子查询再套一层,让MySQL先把需要的结果生成到临时派生表里,再用这个临时表来更新目标表,这样就绕过了直接引用的限制,同时加上关联条件确保每一行对应正确的值:
ALTER TABLE test ADD COLUMN step1_pincode VARCHAR(20); UPDATE test a SET a.step1_pincode = ( SELECT step1_pincode1 FROM ( SELECT id, -- 假设test表有主键id,用来关联每一行 CASE WHEN RetailerPincode IS NOT NULL THEN RetailerPincode ELSE StorePartyPincode END AS step1_pincode1 FROM test b ) AS temp WHERE temp.id = a.id );
方案2:用JOIN方式更新(更高效推荐)
用JOIN替代子查询的方式,逻辑更清晰,执行效率也更高,同样需要关联主键来匹配每一行:
ALTER TABLE test ADD COLUMN step1_pincode VARCHAR(20); UPDATE test a JOIN ( SELECT id, CASE WHEN RetailerPincode IS NOT NULL THEN RetailerPincode ELSE StorePartyPincode END AS step1_pincode1 FROM test ) AS b ON a.id = b.id SET a.step1_pincode = b.step1_pincode1;
关键提醒
- 一定要确保你的
test表有唯一标识字段(比如主键id),这样才能保证每一行的step1_pincode被设置为自身对应的RetailerPincode或StorePartyPincode,否则更新后的数据会混乱。 - 如果你的表没有主键,可以用其他唯一组合字段来做关联,只要能唯一确定每一行即可。
内容的提问来源于stack exchange,提问作者Juned Ansari
相关产品推荐
相关产品推荐

