You can‘t specify target table ‘XXX‘ for update in FROM clause

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

报错如题,意思大致是:在一条 sql 语句中不能先查出来部分内容,再同时又对当前表作修改。

解决方法:给查询加别名,用中间表来实现不是对同一表作操作。

如错误定法:

UPDATE xxx_department 
SET rank = '2'  
WHERE aaa_id in (SELECT id FROM xxx_department WHERE aaa_id IS NULL) ;

改后的写法:

UPDATE xxx_department 
SET rank = '2'  
WHERE aaa_id in 
 (SELECT * FROM (SELECT id FROM xxx_department WHERE aaa_id IS NULL) a );

 

----------------- 我 是 傻 傻 的 分 隔 线 -----------------

2019. 4.3 后记 :

今天在评论中看到另一方法,特别记录一下。(再度感谢这位愿意在评论中分享解决方法的朋友)

-- sql 原写法:
 
   update x set xxx_xxrial_id = null where id not in 
    (select id from x where ccc_info = 1);

 
-- 使用 left join 改写为自链接方式:

    update x left join
       x a
       on x.id = a.id and a.ccc_info = 1
    set xxx_xxrial_id = null
    where a.id is null;

此方法出处:https://stackoverflow.com/questions/51087937/on-update-mysql-row-you-cant-specify-target-table-x-for-update-in-from-claus

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值