Ich fand es hilfreich, einen eindeutigen Index mit einem "ALTER IGNORE" hinzuzufügen, der die Duplikate entfernt und eindeutige Datensätze erzwingt, wie Sie es gerne tun würden. Die Syntax wäre also:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Dies fügt effektiv die eindeutige Einschränkung hinzu, was bedeutet, dass Sie niemals doppelte Datensätze haben und der IGNORE die vorhandenen doppelten Datensätze löscht.
Weitere Informationen zu eh ALTER IGNORE finden Sie hier: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Update: Ich wurde von @Inquisitive darüber informiert, dass dies in Versionen von MySql> 5.5 fehlschlagen kann:
Unter MySQL> 5.5 und in der InnoDB-Tabelle sowie in Percona schlägt dies aufgrund der Funktion zur schnellen Indexerstellung von InnoDB [ http://bugs.mysql.com/bug.php?id=40344] fehl . In diesem Fall zuerst ausführen set session old_alter_table=1
und dann funktioniert der obige Befehl einwandfrei
Update - ALTER IGNORE
In 5.7 entfernt
Aus den Dokumenten
Ab MySQL 5.6.17 ist die IGNORE-Klausel veraltet und ihre Verwendung generiert eine Warnung. IGNORE wird in MySQL 5.7 entfernt.
Einer der MySQL-Entwickler bietet zwei Alternativen :
- Nach eindeutigen Feldern gruppieren und wie oben gezeigt löschen
- Erstellen Sie eine neue Tabelle, fügen Sie einen eindeutigen Index hinzu, verwenden Sie z
INSERT IGNORE
.
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
Abhängig von der Größe Ihres Tisches ist dies jedoch möglicherweise nicht praktikabel