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

如何删除分组中除最高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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:12:33