mysql删除重复数据,常见场景的实现方法

首页 2025-09-23 13:38:59


在 MySQL 中删除重复数据需要保留一条记录而删除其他重复项,具体方法取决于表结构和重复判断标准。以下是几种常见场景的实现方法:

1. 有唯一标识列(如自增 ID)的情况

如果表中有唯一标识列(如 id),可以通过分组找到重复记录,保留 ID 最小(或最大)的那条。
示例表结构:
sql
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50),
  email VARCHAR(50)  -- 假设 email 可能重复
);
 
删除重复邮箱,保留 ID 最小的记录:
sql
DELETE FROM users
WHERE id NOT IN (
  SELECT min_id FROM (
    -- 子查询获取每个邮箱的最小ID
    SELECT MIN(id) AS min_id FROM users GROUP BY email
  ) AS temp
);
 
说明:
  • 内层子查询 SELECT MIN(id) AS min_id FROM users GROUP BY email 用于获取每个重复组中要保留的记录 ID
  • 外层 DELETE 语句删除所有不在保留 ID 列表中的记录
  • 使用临时表(AS temp)是为了避免 MySQL 的 "不能从正在修改的表中选择" 限制

2. 无唯一标识列的情况

如果表中没有唯一标识列,可以通过创建临时表来处理:
sql
-- 1. 创建临时表存储去重后的数据
CREATE TABLE temp_users AS 
SELECT DISTINCT * FROM users;

-- 2. 清空原表
TRUNCATE TABLE users;

-- 3. 将去重后的数据导回原表
INSERT INTO users SELECT * FROM temp_users;

-- 4. 删除临时表
DROP TABLE temp_users;
 
注意:
  • TRUNCATE 会清空表并重置自增 ID,谨慎使用
  • 此方法适合小型表,大型表可能影响性能

3. 按多列判断重复

如果需要根据多列组合判断重复(如 name + email):
sql
DELETE FROM users
WHERE id NOT IN (
  SELECT min_id FROM (
    SELECT MIN(id) AS min_id 
    FROM users 
    GROUP BY name, email  -- 多列组合去重
  ) AS temp
);
 

4. 保留最新 / 最早的记录

如果需要保留最新插入的记录(假设表中有 create_time 字段):
sql
DELETE FROM users
WHERE id NOT IN (
  SELECT id FROM (
    SELECT id FROM users 
    WHERE (name, email, create_time) IN (
      SELECT name, email, MAX(create_time) 
      FROM users 
      GROUP BY name, email
    )
  ) AS temp
);
 

操作建议

  1. 操作前备份数据
    sql
    CREATE TABLE users_backup AS SELECT * FROM users;
    
     
     
  2. 先查询再删除:执行删除前,先通过查询确认要删除的记录:
    sql
    -- 查看重复记录
    SELECT name, email, COUNT(*) 
    FROM users 
    GROUP BY name, email 
    HAVING COUNT(*) > 1;
    
    -- 查看将要保留的记录
    SELECT MIN(id) AS min_id FROM users GROUP BY email;
    
     
     
  3. 添加唯一索引防止 future 重复
    sql
    ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
    
     
     
根据表的具体结构和重复判断标准选择合适的方法,对于大型表,建议分批次删除以避免锁表时间过长。
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道