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 的时候,目标表不能在其直接子查询中存在,需要在子查询中给目标表起个别名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了