如何解决子查询引用正在修改的同表问题?附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
相关产品推荐
相关产品推荐

