在 MySQL 中删除重复数据并只保留一条,可以通过以下方法实现,具体取决于你的表结构和重复判断依据:
如果表中有自增主键或唯一标识列(如 id
),可以通过以下方式删除重复项,保留 id
最小(或最大)的一条:
DELETE FROM students
WHERE id NOT IN (
SELECT min_id FROM (
SELECT MIN(id) AS min_id
FROM students
GROUP BY name, email
) AS temp
);
对于大数据量表,JOIN 方式比子查询更高效:
DELETE t1 FROM students t1
JOIN students t2
ON t1.name = t2.name AND t1.email = t2.email
WHERE t1.id > t2.id;
如果表中没有唯一标识列,可以先创建临时表存储需要保留的数据,清空原表后再插入回来:
CREATE TABLE temp_students AS
SELECT DISTINCT * FROM students;
TRUNCATE TABLE students;
INSERT INTO students SELECT * FROM temp_students;
DROP TABLE temp_students;
假设我们有以下 users
表,需要根据 username
字段删除重复数据:
执行以下命令将保留 id=1
的记录,删除 id=3
和 id=4
:
DELETE t1 FROM users t1
JOIN users t2
ON t1.username = t2.username
WHERE t1.id > t2.id;
-
操作前务必备份数据,防止误删
-
对于大型表,建议分批次删除,避免锁表时间过长
-
可以先执行查询语句验证将要删除的数据:
SELECT * FROM students t1
JOIN students t2
ON t1.name = t2.name AND t1.email = t2.email
WHERE t1.id > t2.id;
-
为避免未来产生重复数据,建议为相关字段创建唯一索引:
ALTER TABLE students ADD UNIQUE INDEX idx_name_email (name, email);
选择适合你表结构的方法,确保只保留需要的唯一记录。