MySQL DELETE FROM语句的使用注意事项

在MySQL中,写SQL语句的时候 ,可能会遇到 “You can’t specify target table ‘表名’ for update in FROM clause” 这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值。
注意,这个问题只出现于mysql,mssql和Oracle不会出现此问题。

错题出处


错误代码如下:

DELETE FROM   
     `Person`
WHERE    
    `Id` >= ALL(    SELECT
                        p2.`Id`
                    FROM 
                       `Person` p2
                    WHERE
                       `Email` = p2.`Email`
);

解决方法:
创建临时表

DELETE FROM
    `Person`
WHERE `Id` NOT IN
(
    SELECT t.`Id`
    #加上这个外层筛选可以避免You can't specify target table for update in FROM clause错误
    FROM (
        SELECT 
        #不加 " AS `Id` " 会有 “Unknown column 't.Id ' in 'field list'” 错误
            MIN(`Id`) AS `Id`
        FROM 
            `Person` 
        GROUP BY 
            `Email`
    ) t
)
;

版权声明:本文为qq_44688635原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。