如何从 MySQL 数据库中删除重复数据

说白了,删除重复的MySQL数据是一个三步过程:首先找到它,然后删除它,最后采取预防措施。

我们先来说说最重要的事情。
使用 GROUP BY+HAVING 查找重复项,例如B. SELECT 名字、姓氏、电子邮件、COUNT() FROM 员工 GROUP BY 名字、姓氏、电子邮件 HAVING COUNT() > 1 . 去年我们做了这个项目,我们花了 3 个小时才发现一堆拼写错误,这些错误导致仅使用此方法就出现了重复。
还有一点:删除的时候,不要全部删除。
使用自连接来保留 ID 最小的一个,例如B. 从员工 e1 中删除 e1 ,加入员工 e2 上的 e1 .first_name=e2 .first_name AND e1 .last_name=e2 .last_name AND e1 .email=e2 .email AND e1 .id>e2 .id。
这不会锁定主表。
还有另一个关键细节。
当保留条件复杂时(例如按提交日期),临时表很有用。
使用 CREATE TEMPORARY TABLE temp_employees AS SELECT FROM 员工 e1 WHERE e1 .id IN (SELECT MIN(id) FROM 员工组 BY 名字、姓氏、电子邮件)。
起初我以为我必须为此编写一个触发器,但后来我发现直接使用 MIN(id) 更容易。

等一下,还有一件事。
不能随机添加防止重复的唯一约束,例如B.直接ALTER TABLE员工ADD CONSTRAINT unique_employee UNIQUE(名字,姓氏,电子邮件)。
原来,一位客户坚持保存一封空白电子邮件,立即报错。
说实话,这完全是一个骗局。

建议先对组涉及的列进行索引,例如B. 在员工上创建索引 idx_name_email(名字、姓氏、电子邮件)。
这可以节省很多时间。
如果要批量删除,可以使用DELETE ... LIMIT 1 000来批量删除。
上次删除3 000条数据,我做了五次,这比一次全部删除要快得多。
然而,有些人认为临时表太麻烦了。
事实上,保留逻辑也可以使用with子句来实现,值得尝试。

数据库去重的几种方法

这就是洞。
别相信。
不要这样做。

实用提醒:优先使用临时表或 CTE。