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


    最近遇到一个表的的问题,就是由于批量处理错误,把一个表的某个字段的删除掉了,现在解决方案是通过另一个表对应的一个字段进行补充。自己尝试一个个去填,但是发现一千多个根本查不过来(折腾了一两个小时才完成了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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果报错

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

    我想是不是搞错了
    我把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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

  • 相关阅读:
    【quartz】从数据库中读取配置实现动态定时任务
    es6和commonjs对导入导出的值修改是否影响原模块
    标准括号判断
    shell 脚本语句
    【算法练习Day27】买卖股票的最佳时机 II&&跳跃游戏&&跳跃游戏 II
    problen(5)ubuntu版本问题
    【stm32】stm32MX定时器
    SSM学习——Spring事务(9)
    SSM - Springboot - MyBatis-Plus 全栈体系(二十三)
    SHELL脚本编程----netstat练习2-查看和3306端口建立的连接
  • 原文地址:https://blog.csdn.net/FeiChangWuRao/article/details/126414552