我收到了一个相当大的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设置为主键。
请建议最好和最准确的方法来做到这一点。提前谢谢。
答案 0 :(得分: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
答案 1 :(得分:1)
我遇到了这个问题,这对我很有帮助:
CREATE TABLE newtable SELECT * FROM oldtable GROUP BY unique_id;
然后删除oldtable,并将新表重命名为旧表名
答案 2 :(得分:0)
试试这个:
select unique_id, field01 , field02 , field03 from (table_name) group by unique_id having sum(unique_id)<1