如何删除分组中除最高ID记录外的所有行?(MySQL表场景)
解决MySQL重复application_id记录并添加唯一键的方案
没问题,我帮你一步步搞定这个需求:既要清理重复的application_id记录(只保留每组中id最大的那条),又要给application_id添加唯一键避免后续出现重复数据。
第一步:先备份数据(重要!)
在做任何数据删除操作前,一定要先备份表数据,防止误操作导致数据丢失。你可以选下面两种方式之一:
方式1:创建备份表
CREATE TABLE mytable_backup AS SELECT * FROM mytable;
方式2:用mysqldump导出备份
mysqldump -u 你的用户名 -p 你的数据库名 mytable > mytable_backup.sql
第二步:确认重复数据(可选但推荐)
先查询一下哪些application_id存在重复,以及每组要保留的最大id是多少,做到心里有数:
SELECT application_id, MAX(id) AS 要保留的ID, COUNT(*) AS 该组总记录数 FROM mytable GROUP BY application_id HAVING COUNT(*) > 1;
第三步:删除重复记录(保留每组ID最大的)
这里提供两种高效的删除方式,你可以根据自己的表大小选择:
方式1:自连接删除(大表推荐,性能更好)
这种方式通过表自连接,直接删除同一application_id下id较小的记录:
DELETE t1 FROM mytable t1 JOIN mytable t2 ON t1.application_id = t2.application_id WHERE t1.id < t2.id;
方式2:子查询删除(逻辑更直观)
因为MySQL不允许在DELETE语句的WHERE子句中直接引用正在修改的表,所以需要套一层临时表来存储每组的最大id:
DELETE FROM mytable WHERE id NOT IN ( SELECT max_id FROM ( SELECT MAX(id) AS max_id FROM mytable GROUP BY application_id ) AS temp_table );
执行完删除后,你可以再跑一遍第二步的查询,确认重复记录已经被清理干净。
第四步:添加application_id唯一键
现在表中application_id已经没有重复了,可以放心添加唯一键约束:
ALTER TABLE mytable ADD UNIQUE KEY idx_unique_application_id (application_id);
这样以后再插入重复的application_id时,MySQL就会直接报错,阻止重复数据的产生。
内容的提问来源于stack exchange,提问作者planetp
相关产品推荐
相关产品推荐

