在没有主键的情况下删除MySQL数据库中的重复条目

Pra*_*ava 5 mysql database distinct primary-key duplicates

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

数据库的结构是这样的:

unique_id | field01 | field02 | field03 | field04 | ...... | field26 | field27 |
Run Code Online (Sandbox Code Playgroud)

现在虽然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 |
Run Code Online (Sandbox Code Playgroud)

应该成为:

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 |
Run Code Online (Sandbox Code Playgroud)

或者这也没关系:

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 |
Run Code Online (Sandbox Code Playgroud)

完成后,我需要将unique_is设置为主键.

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

fth*_*lla 2

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

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX dupidx (unique_id)
Run Code Online (Sandbox Code Playgroud)

但如果即使使用 IGNORE 子句仍然出现错误,请尝试以下操作:

ALTER TABLE your_table ENGINE MyISAM;
ALTER TABLE IGNORE your_table ADD UNIQUE INDEX dupidx (unique_id);
ALTER TABLE your_table ENGINE InnoDB;
Run Code Online (Sandbox Code Playgroud)

如果您只是想显示数据,为每个重复的 id 只保留一行,您可以使用以下命令:

SELECT *
FROM your_table
GROUP BY unique_id
Run Code Online (Sandbox Code Playgroud)