5

我收到了一个相当大的 MySQL 数据库,其中有很多重复项。大约三分之一的数据库是重复的。它也缺少主键。

数据库的结构是这样的:

unique_id | field01 | field02 | field03 | field04 | ...... | field26 | field27 |

现在虽然 unique_id 应该是唯一的;有很多重复。

此外,对于属于特定 unique_id 副本的一组行,其余列可能相同也可能不同。例如,查看下面的 unique_id 'id_1',两个实例中的 field01 相同,但 field02 和 field03 不同。

我想删除重复项,并且每个 unique_id 仅保留一份副本。哪一个幸存下来并不重要。

例子:

id_1 | abc  | dfd  | NULL | ... | def | 
id_2 | abc  | daf  | ghi  | ... | 12a |
id_1 | abc  | xyz  | jkl  | ... | def |
id_4 | aaa  | bbb  | NULL | ... | def |
id_3 | NULL | bbb  | NULL | ... | 123 |
id_5 | 1e3  | NULL | NULL | ... | def |
id_3 | aaa  | bbb  | fds  | ... | def |
id_9 | awa  | bbb  | NULL | ... | 910 |

应该变成:

id_1 | abc  | dfd  | NULL | ... | def | 
id_2 | abc  | daf  | ghi  | ... | 12a |
id_4 | aaa  | bbb  | NULL | ... | def |
id_3 | NULL | bbb  | NULL | ... | 123 |
id_5 | 1e3  | NULL | NULL | ... | def |
id_9 | awa  | bbb  | NULL | ... | 910 |

或者这也很好:

id_2 | abc  | daf  | ghi  | ... | 12a |
id_1 | abc  | xyz  | jkl  | ... | def |
id_4 | aaa  | bbb  | NULL | ... | def |
id_5 | 1e3  | NULL | NULL | ... | def |
id_3 | aaa  | bbb  | fds  | ... | def |
id_9 | awa  | bbb  | NULL | ... | 910 |

完成此操作后,我需要将 unique_is 设置为主键。

请建议最好和准确的方法来做到这一点。提前致谢。

4

3 回答 3

2

您可以在表中添加唯一索引,忽略所有错误,并让 MySql 为您删除所有重复的行(除了一个):

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX dupidx (unique_id)

但如果你仍然得到一个错误,即使你使用 IGNORE 子句,试试这个:

ALTER TABLE your_table ENGINE MyISAM;
ALTER TABLE IGNORE your_table ADD UNIQUE INDEX dupidx (unique_id);
ALTER TABLE your_table ENGINE InnoDB;

如果您只是对显示数据感兴趣,为每个重复的 id 保留一行,您可以使用:

SELECT *
FROM your_table
GROUP BY unique_id
于 2012-12-10T08:59:04.123 回答
1

我遇到了这个问题,这对我很有用:

CREATE TABLE newtable SELECT * FROM oldtable GROUP BY unique_id;

然后删除旧表,并将新表重命名为旧表名

于 2014-10-30T15:18:12.817 回答
0

尝试这个 :

select unique_id, field01 , field02 , field03 from (table_name) group by unique_id having sum(unique_id)<1
于 2012-12-10T09:32:00.240 回答