mysql删除重复数据只保留一条,选择适合你表结构的方法

时间:2025-09-15 14:56

在 MySQL 中删除重复数据并只保留一条,可以通过以下方法实现,具体取决于你的表结构和重复判断依据:

方法 1:使用 DELETE 结合子查询(适用于有唯一标识列的表)

如果表中有自增主键或唯一标识列(如 id),可以通过以下方式删除重复项,保留 id 最小(或最大)的一条:

sql
-- 假设表名为 students,重复判断依据是 name 和 email 字段
DELETE FROM students
WHERE id NOT IN (
    SELECT min_id FROM (
        -- 子查询获取每个重复组中最小的 id
        SELECT MIN(id) AS min_id
        FROM students
        GROUP BY name, email  -- 按重复字段分组
    ) AS temp
);
 

方法 2:使用 DELETE JOIN 方式(效率更高)

对于大数据量表,JOIN 方式比子查询更高效:

sql
-- 删除重复数据,保留每组中 id 最小的记录
DELETE t1 FROM students t1
JOIN students t2 
ON t1.name = t2.name AND t1.email = t2.email  -- 重复判断条件
WHERE t1.id > t2.id;  -- 保留 id 较小的记录
 

方法 3:没有唯一标识列的情况

如果表中没有唯一标识列,可以先创建临时表存储需要保留的数据,清空原表后再插入回来:

sql
-- 1. 创建临时表存储去重后的数据
CREATE TABLE temp_students AS
SELECT DISTINCT * FROM students;

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

-- 3. 将去重后的数据插回原表
INSERT INTO students SELECT * FROM temp_students;

-- 4. 删除临时表
DROP TABLE temp_students;
 

示例说明

假设我们有以下 users 表,需要根据 username 字段删除重复数据:

id username email
1 alice alice@test.com
2 bob bob@test.com
3 alice alice@test.com
4 alice alice@test.com

执行以下命令将保留 id=1 的记录,删除 id=3 和 id=4

sql
DELETE t1 FROM users t1
JOIN users t2 
ON t1.username = t2.username
WHERE t1.id > t2.id;
 

注意事项

  1. 操作前务必备份数据,防止误删
  2. 对于大型表,建议分批次删除,避免锁表时间过长
  3. 可以先执行查询语句验证将要删除的数据:
    sql
    -- 查看将要删除的重复数据
    SELECT * FROM students t1
    JOIN students t2 
    ON t1.name = t2.name AND t1.email = t2.email
    WHERE t1.id > t2.id;
    
     
  4. 为避免未来产生重复数据,建议为相关字段创建唯一索引:
    sql
    ALTER TABLE students ADD UNIQUE INDEX idx_name_email (name, email);
    
     

选择适合你表结构的方法,确保只保留需要的唯一记录。
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
企业级数据架构:MySQL递归查询在组织权限树中的高级应用实践
企业级MySQL索引优化实战:高并发场景下的索引设计与调优
企业级MySQL时间管理实践:高并发场景下的性能优化与时区解决方案