You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决子查询引用正在修改的同表问题?附LeetCode实例

解决「删除重复邮箱」SQL错误的方案

你的理解完全正确

这个错误的核心原因就是MySQL不允许在DELETE或UPDATE操作的查询子句中直接引用正在被修改的目标表——因为引擎无法在修改数据的同时确定要读取的数据源状态,会引发数据一致性冲突。单纯给子查询加别名无法解决,因为本质还是直接关联了原表。

修正后的可行方案

方案一:嵌套子查询生成临时表

把原有的子查询再套一层,让MySQL先将子查询结果生成临时表,绕开直接引用目标表的限制:

DELETE FROM Person
WHERE id NOT IN (
    SELECT max_id FROM (
        SELECT MAX(id) AS max_id
        FROM Person
        GROUP BY email
    ) AS temp_table
)

这个方案和你原本的逻辑一致:保留每个邮箱分组中id最大的记录,删除其余所有重复邮箱的记录。

方案二:自连接删除(更高效)

用表自连接的方式,直接定位到每个邮箱分组中id较小的重复记录并删除:

DELETE p1
FROM Person p1
JOIN Person p2 ON p1.email = p2.email AND p1.id < p2.id

这种方法不需要嵌套子查询,执行效率更高,逻辑也更直观——只要找到同邮箱下id比自己大的记录,就说明当前记录是重复的需要删除。

内容的提问来源于stack exchange,提问作者Simon Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:09:54