mysql 错误 1093 - You can't specify target table 'user_list_log' for update in FROM clause 查找更新失败 update delete

你在哭吗? 没有,我只是过敏了。 对什么过敏? 人生。

 

在执行mysql  删除脚本的时候,出现了意向不到的错误

场景:

在user_list_log  表中,由于前端代码不严谨出现了重复数据,于是就想着用mysql脚本执行mysql语句进行删除掉 id 比较小的多余数据,所以按照思路就写着就出现如下mysql语句

SELECT
    min( id ) AS id 
FROM
    `user_list_log` 
WHERE
    platform_id = 5 
    AND type = 'sale_price' 
GROUP BY
    online_id,
    variants_id 
HAVING
    count( * ) > 1

先找出 重复数据,然后再进行用 主键id  in  进行执行删除

DELETE 
FROM
        `user_list_log`
WHERE
        id IN (
SELECT
        min( id ) AS id 
FROM
        `user_list_log` 
WHERE
        platform_id = 5 
        AND `status` = 1 
GROUP BY
        online_id,
        variants_id 
HAVING
        count( * ) > 1 
        );

 

然后就出现  标题所示问题,思路上是没问题的,但是就是执行失败,于是网站搜索了一下,

在子查询再加一层查询,就可以了,执行mysql 如下

DELETE 
FROM
    `user_list_log` 
WHERE
    id IN (
SELECT
    a.id 
FROM
    (
SELECT
    min( id ) AS id 
FROM
    `pdvee_online_batch_shopee` 
WHERE
    platform_id = 5 
    AND type = 'sale_price' 
GROUP BY
    online_id,
    variants_id 
HAVING
    count( * ) > 1 
    ) AS a 
    );

这样的就没有问题了

 

update 语句也是一样的

 

UPDATE `user_list_log` 
SET `status` = 1 
WHERE
    id IN (
SELECT
    a.id 
FROM
    ( SELECT id FROM `user_list_log` WHERE type = 'sale_price' AND `status` = 3 AND update_time > '2022-10-12 00:00:00' AND update_time < '2022-10-12 14:30:00' ) AS a 
    );

 

 

原因:

翻找了对应的手册,mysql 中有说明,在执行 delete 或者 update 的时候,目标表不能在其直接子查询中存在,需要在子查询中给目标表起个别名

 

 

posted @ 2021-11-16 08:54  方达达  阅读(47)  评论(0编辑  收藏  举报