联表更新数据以及You can‘t specify target table ‘xxx‘ for update in FROM clause

博客讲述了在处理MySQL数据库中遇到的问题,即因批量处理错误导致表中某字段缺失,作者尝试手动填充但效率低下。为提高效率,作者转向使用SQL语句进行批量更新。文中详细描述了尝试的SQL更新语句及遇到的错误——不能在FROM子句中更新目标表。解决方案是通过在外层添加括号来规避MySQL的限制。作者提醒,对于批量数据问题,应优先考虑使用SQL和联表更新来提升处理能力。
摘要由CSDN通过智能技术生成

最近遇到一个表的的问题,就是由于批量处理错误,把一个表的某个字段的删除掉了,现在解决方案是通过另一个表对应的一个字段进行补充。自己尝试一个个去填,但是发现一千多个根本查不过来(折腾了一两个小时才完成了10%的部分)。所以想到如何批量操作,那还要用SQL来解决。

大致的思路是
就是A 表的 b字段现在为空,但是可以通过 A表的的c字段关联C表c字段,通过C表中的b字段来回填A表中的b字段。

UPDATE a aas 
LEFT JOIN b ae ON ae.id = a.employee_id
SET a.department_id 

=	 b.department_id

WHERE
	 aas.id  IN(
	
	    select a.id from ams_asset a WHERE a.employee_id is NOT null AND a.department_id is NULL
			
	)
	AND aas.merchant_id =1003523 

结果报错

- You can't specify target table 'aas' for update in FROM clause

我想是不是搞错了
我把aas.id in (1001) 给他一个确定的值,发现错就不保了,说明问题可能是IN里面的查找语句的问题。

搜了一下资料,这个是MySQL自己的问题,大概意思是MySQL不支持你更新某张表通过你更新的这张表范围内de

类似你更新A, 但是你是通过一个select语句来把你要修改A表的对应的id来去修改更新A,这样是不行的。

解决方法一种是你这个范围不是从A里面查出来的,另一种就是再包一层给你查询A的select语句,就是加个括号。

我们一般来说都会选择方法二
基于上个SQL进行修改添加括号抱起来,如下:

UPDATE ams_asset aas 
LEFT JOIN ams_employee ae ON ae.id = aas.employee_id
SET aas.department_id 

=	 ae.department_id

WHERE
	 aas.id  IN(
	
	    select a.id from ams_asset a WHERE a.employee_id is NOT null AND a.department_id is NULL
			
	)
	AND aas.merchant_id =1003523 

PS 以后批量数据问题优先考虑SQL,联表更新的语句,锻炼自己复杂的SQL语句能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值