不能在在同一语句中,先select出同一表中的id,再使用where in 语句 update、delete这个表的数据,否则会报You can't specify target table for update in FROM clause的错误。
下例子考虑到更加简单和说服力,已经由原文改为自己的例子了:

UPDATE erp_user 
SET STATUS = 1 
WHERE
    -- 如果查询条件的表是要更新的那张表的话,如这个例子,这样就会遇到这个问题;
    -- 否则,如果查询条件的表不是要更新的那张表的话,就不会遇到这个问题;
    id IN ( SELECT id FROM erp_user WHERE STATUS = 2 );

改写成下面就行了:

UPDATE erp_user 
SET STATUS = 1 
WHERE
    id IN ( SELECT u.id AS id FROM ( SELECT id FROM erp_user WHERE STATUS = 2 ) u ) 
    AND id = 0;

也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和oracle不会出现此问题

最后修改:2023 年 12 月 30 日
如果觉得我的文章对你有用,请随意赞赏