Uznałem, że pomocne jest dodanie niepotrzebnego indeksu przy użyciu opcji „ALTER IGNORE”, która usuwa duplikaty i wymusza unikalne nagrania, które brzmią tak, jak chciałbyś to zrobić. Zatem składnia byłaby następująca:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
To skutecznie dodaje unikalne ograniczenie, co oznacza, że nigdy nie będziesz mieć zduplikowanych rekordów, a IGNORE usuwa istniejące duplikaty.
Możesz przeczytać więcej o eh ALTER IGNORE tutaj: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Aktualizacja: @Inquisitive poinformował mnie, że może się to nie udać w wersjach MySql> 5.5:
Nie udaje się na MySQL> 5.5 i na tabeli InnoDB oraz w Perconie z powodu ich funkcji szybkiego tworzenia indeksu w InnoDB [ http://bugs.mysql.com/bug.php?id=40344] . W takim przypadku najpierw uruchom, set session old_alter_table=1
a następnie powyższe polecenie będzie działać dobrze
Aktualizacja - ALTER IGNORE
usunięta w 5.7
Z dokumentów
W MySQL 5.6.17 klauzula IGNORE jest przestarzała, a jej użycie generuje ostrzeżenie. IGNORE została usunięta w MySQL 5.7.
Jeden z deweloperów MySQL podaje dwie alternatywy :
- Pogrupuj według unikalnych pól i usuń, jak pokazano powyżej
- Utwórz nową tabelę, dodaj unikalny indeks, użyj
INSERT IGNORE
, np .:
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;
Ale w zależności od wielkości stołu może to nie być praktyczne