2012-12-10 7 views
5

Ich habe eine einigermaßen große MySQL-Datenbank mit vielen Duplikaten erhalten. Etwa ein Drittel der Datenbank sind Dubletten. Es ist auch fehlt ein Primärschlüssel.Doppelte Einträge in der MySQL-Datenbank ohne Primärschlüssel entfernen

Die Struktur der Datenbank ist so:

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

Jetzt, während die unique_id soll, na ja, einzigartig sein; Es gibt viele Duplikate.

Auch für eine Reihe von Zeilen, die zu Kopien einer bestimmten eindeutigen_ID gehören, können die übrigen Spalten identisch sein oder nicht. Wenn Sie zum Beispiel unique_id 'id_1' betrachten, ist field01 in beiden Fällen gleich, aber field02 & field03 ist nicht identisch.

Ich möchte die Wiederholungen entfernen und haben nur eine Kopie jeder unique_id überleben. Es spielt keine Rolle, wer überlebt.

Beispiel:

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 | 

Sollte sich:

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 | 

Oder das ist auch in Ordnung:

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 | 

Sobald dies erledigt ist, ich müsste als die festlegen unique_is Primärschlüssel.

Bitte beraten Sie die beste und genaue Weise, dies zu tun. Danke im Voraus.

+0

Do Sie möchten die Dublettenprüfung nur für die Spalte unique_id durchführen? –

+0

Bitte beachten Sie in diesem Thread erhalten Sie einige Erkenntnisse über das Löschen von doppelten Werten :: http://StackOverflow.com/Questions/2728413/Equivalent-of-Oracles-Rowid-in-Mysql –

Antwort

2

Sie können einen eindeutigen Index in der Tabelle hinzufügen, um alle Fehler zu ignorieren, und lassen Sie MySql alle duplizierten Zeilen löschen (mit einer Ausnahme) für Sie:

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX dupidx (unique_id) 

aber wenn Sie immer noch eine Fehlermeldung erhalten, wenn Sie sich selbst verwenden Klausel IGNORE, versuchen Sie dies:

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

Wenn Sie nur daran interessiert sind Ihre Daten zeigen, und hält nur eine Zeile für jede duplizierte id, könnten Sie verwenden:

SELECT * 
FROM your_table 
GROUP BY unique_id 
diese
0

versuchen: select unique_id, field01 , field02 , field03 from (table_name) group by unique_id having sum(unique_id)<1

1

ich dieses Problem hatte, und das war toll für mich:

CREATE TABLE newtable SELECT * FROM oldtable GROUP BY unique_id; 

dann die OldTable fallen, und benennen Sie die neue Tabelle mit dem alten Tabellennamen