2012-12-10 31 views
5

Otrzymałem dość dużą bazę danych MySQL z dużą ilością duplikatów. Około jedna trzecia bazy danych to duplikaty. Jest również brakuje klucz podstawowy.Usuwanie duplikatów wpisów w bazie danych MySQL bez klucza podstawowego

Struktura bazy danych jest tak:

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

Teraz natomiast unique_id ma być dobrze, niepowtarzalny; istnieje wiele duplikatów.

Ponadto, dla zestawu wierszy należących do kopii określonego unikalnego identyfikatora, pozostałe kolumny mogą być lub nie być takie same. Na przykład, patrząc na unique_id 'id_1' poniżej, pole01 jest takie samo w obu przypadkach, ale field02 & pole03 nie są.

Chciałbym usunąć powtórzenia i mieć tylko jedną kopię każdego unique_id przetrwać. Nie ma znaczenia, który z nich przetrwa.

Przykład:

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 | 

powinien stać:

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 | 

Albo to też jest w porządku:

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 | 

Gdy to nastąpi, będzie trzeba ustawić unique_is jako główny klucz.

Proszę wskazać najlepszy i dokładny sposób wykonania tej czynności. Z góry dziękuję.

+0

Do chcesz sprawdzić powielanie tylko w kolumnie unique_id? –

+0

Proszę odnieść się do tego wątku, otrzymasz informacje na temat usuwania duplikatów wartości :: http://stackoverflow.com/questions/2728413/equivalent-of-oracles-rowid-in-mysql –

Odpowiedz

2

Można dodać unikatowy indeks w tabeli, ignorując wszelkie błędy i pozwól MySQL usunąć wszystkie zduplikowane wiersze (z wyjątkiem jednego) dla Ciebie:

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX dupidx (unique_id) 

ale jeśli nadal pojawia się błąd, nawet jeśli używać IGNORUJ klauzulę, spróbuj tego:

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

Jeśli interesuje tylko wyświetlanie danych, zachowując tylko jeden wiersz dla każdego powielanego ID, można użyć to:

SELECT * 
FROM your_table 
GROUP BY unique_id 
0

spróbuj tego: select unique_id, field01 , field02 , field03 from (table_name) group by unique_id having sum(unique_id)<1

1

miałem ten problem, i to było wspaniałe dla mnie:

CREATE TABLE newtable SELECT * FROM oldtable GROUP BY unique_id; 

Następnie upuść oldtable i zmień nazwę nowej tabeli do starej nazwy tabeli

Powiązane problemy