如何在MySQL中删除product_id重复的行并保留最新的记录
MySQL 删除重复 product_id 记录(仅保留最新条)方案
核心逻辑
按照product_id分组,每组保留id最大的记录(id自增场景下id越大代表记录越新),其余重复记录删除。两种常用实现方式如下,均支持后续新增重复数据时重复执行自动清理旧记录。
方案1:子查询法(新手易理解)
适合小数据量场景,逻辑直观:
-- 请将下面的 product_rule 替换为你实际的表名 DELETE FROM product_rule WHERE id NOT IN ( SELECT keep_id FROM ( -- 先查询每个 product_id 要保留的最大id SELECT MAX(id) AS keep_id FROM product_rule GROUP BY product_id ) AS temp_table );
注意:MySQL 不允许在 DELETE 语句中直接引用操作表作为子查询源,因此需要额外嵌套一层临时表
temp_table绕过语法限制。
方案2:自连接删除(性能更优)
适合中大数据量场景,执行效率更高:
-- 请将下面的 product_rule 替换为你实际的表名 DELETE t1 FROM product_rule t1 INNER JOIN product_rule t2 ON t1.product_id = t2.product_id AND t1.id < t2.id;
逻辑说明:将表和自身做等值连接,匹配相同product_id的记录,只要t1的id小于t2,就说明t1是更旧的重复记录,直接删除即可。
前置验证建议(避免误删)
执行删除前先运行以下查询确认要删除的记录符合预期:
- 查询所有待保留的记录:
SELECT MAX(id) AS id, rule_id, product_id FROM product_rule GROUP BY product_id;
- 查询所有待删除的重复记录:
SELECT * FROM product_rule WHERE id NOT IN ( SELECT keep_id FROM ( SELECT MAX(id) AS keep_id FROM product_rule GROUP BY product_id ) AS temp_table );
注意事项
- 数据量超过10万时建议提前给
product_id和id字段加索引,大幅提升执行效率 - 生产环境操作前务必先备份数据,建议先在测试环境验证逻辑正确性
内容的提问来源于stack exchange,提问作者Eatsam ul haq
相关产品推荐
相关产品推荐

