MySQL新版本下如何删除数据表中的单条重复行?
删除MySQL数据表中的单条重复记录
问题描述
现有如下数据表:
| SchoolId | StudentName |
|---|---|
| 101 | Majid Bhuiyan |
| 101 | Majid Bhuiyan |
| 102 | Arif |
| 103 | Tamim Rahman |
| 104 | Sourov Doggesh |
需要删除其中一行重复的SchoolId=101,StudentName=Majid Bhuiyan记录,仅保留一行。
解决方案
方法1:自连接删除(兼容所有MySQL版本)
如果表无主键或唯一标识列,可利用InnoDB隐藏的行标识列ctid(MyISAM引擎用ROWID)区分重复行,保留一行、删除另一行:
DELETE t1 FROM your_table t1 JOIN your_table t2 ON t1.SchoolId = t2.SchoolId AND t1.StudentName = t2.StudentName AND t1.ctid > t2.ctid;
方法2:窗口函数删除(MySQL 8.0及以上版本)
借助ROW_NUMBER()窗口函数给重复行编号,精准删除目标重复项:
WITH ranked_students AS ( SELECT SchoolId, StudentName, ROW_NUMBER() OVER (PARTITION BY SchoolId, StudentName ORDER BY (SELECT NULL)) AS rn FROM your_table ) DELETE FROM your_table WHERE (SchoolId, StudentName, rn) IN ( SELECT SchoolId, StudentName, rn FROM ranked_students WHERE rn > 1 AND SchoolId = 101 AND StudentName = 'Majid Bhuiyan' );
注意事项
- 执行删除前务必备份数据,避免误删重要内容。
- 若表有主键/自增列,可直接用该列替代
ctid或窗口函数的排序条件,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Majid
相关产品推荐
相关产品推荐

