是否有一种清理MySQL清理重复条目的方法?

时间:2008-10-31 17:27:15

标签: sql mysql dirty-data

在表格中,我有三列 - id,name和count。很多名称列都是相同的(由于早期缺少UNIQUE),我想解决这个问题。但是,id列被其他人使用(4或5,我认为 - 我必须检查文档)表来查找名称,只是删除它们会破坏事物。那么有没有一种好的,干净的方式来说“找到所有相同的记录并将它们合并在一起”?

2 个答案:

答案 0 :(得分:4)

这种问题不时出现。不,没有一个非常干净的方法来做到这一点。您必须更改子表中依赖于父表中不需要的值的所有行,然后才能消除父表中不需要的行。

MySQL支持多表UPDATEDELETE语句(与其他品牌的数据库不同),所以你可以做一些非常巧妙的技巧,如下所示:

UPDATE names n1
  JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name)
  JOIN child_table c ON (n2.id = c.id)
SET c.name_id = n1.id
ORDER BY n1.id DESC;

在所有子表上完成此操作后,您可以使用MySQL的多表DELETE语法删除父表中不需要的行:

DELETE FROM n2
  USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name);

答案 1 :(得分:0)

为什么你不能做像

这样的事情
update dependent_table set name_id = <id you want to keep> where name_id in (
    select id from names where name = 'foo' and id != <id you want to keep>)