数据库mysql怎么删除重复项

说实话,在过去的1 0年里,我在处理MySQL中的重复数据时遇到了很多陷阱,也看到了很多解决方案。
你列出的步骤非常清楚,但我想补充一下我自己对陷阱的理解和经验。

例如,在第二步中,使用 GROUP BY 检查重复项特别有用。
上次处理旧系统数据时,我发现用户表中的邮箱重复得可笑。
我用了这个命令。
SQL 选择电子邮件,COUNT() 来自用户 按电子邮件分组 HAVING COUNT() > 1 ;
这个结果让我震惊。
对数百个邮箱重复了数百次。
此时,第三步就发挥作用了。
您提到的自连接方法当然是最常用的。
通常,您会添加排序条件,例如创建时间顺序。
SQL 从用户 t1 中删除 t1 内连接用户 t2 在 t1 .email = t2 .email 上 and t1 .id < t2>这个id < t2>但有一次我遇到了一个表,没有ID字段,只能按创建时间排序。
结果,客户抱怨他们的最新数据一夜之间就被删除了。
我当时真的很尴尬。

说到备份,这绝对是我的信念。
我曾经忘记备份并执行了DELETE。
我按 Ctrl+C 停止中间删除,最后使用事务回滚。
所以我说的“我们建议批量删除大表”就显得尤为重要。
我通常使用的是 SQL 从用户 t1 中删除 t1 内连接用户 t2 在 t1 .email = t2 .email 上 并且 t1 .id < t2>一次删除 1 ,000 个项目并循环运行。
至少可以安心睡觉了。

长期规划实际上需要添加独特的约束。
我最近接管了一个系统,并担心数据的质量。
直接向所有唯一字段添加约束。
结果半夜数据库震动了三个小时。
服务器管理员那一刻都快哭了。
因此,该操作应先在测试环境中进行。
不要直接在生产服务器上运行 ALTER TABLE ADD UNIQUE。

临时表方式非常稳定,但是有影响表结构的缺点。
上次我使用这个方法时,我忘记了 DROP TABLE。
结果,新表缺少三个字段。
我花了很长时间才找到答案。
到目前为止,我习惯于在执行 DELETE 之前使用 SELECT DISTINCT 来确保它是正确的。

最后说一个小知识:临时表方法实际上比自连接DELETE要快,尤其是当重复数据量特别大的时候。
经测试,使用 CREATE TABLE...SELECT DISTINCT 和 DROP/RENAME 的速度比在 5 00 万个重复项上使用 DELETE 方法快 3 倍。
当然,这是具体业务这取决于场景。
如果您有大量表关联,DELETE 可能会更灵活。

无论如何,处理重复数据没有绝对的最佳解决方案。
您应该根据数据量、表结构和业务需求灵活选择。
我总结的很全面了,但关键是要多跑测试,不要在使用生产数据时手舞足蹈。

MySQL_select distinct无法实现只对单列去重,并显示多列结果的解决方法

直接结论:使用GROUP BY。
SQL: sql 选择值、ID 来自你的表 按值分组
如果需要保留特定ID: sql 选择值,MIN(id) 作为 ID 来自你的表 GROUP BY value
不要使用 DISTINCT。

Linux下删除大数据文件中部分字段重复行的方法