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 @   方达达  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示