Jeśli masz duplikaty w tabeli i używasz
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
zapytanie zakończy się błędem 1062 (duplikat klucza).
Ale jeśli używasz IGNORE
-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
duplikaty zostaną usunięte. Ale dokumentacja nie określa, który wiersz zostanie zachowany:
Jeśli Twoja wersja to 5.7.4 lub nowsza — możesz:
- Skopiuj dane do tymczasowej tabeli (technicznie nie musi być tymczasowe).
- Obetnij oryginalną tabelę.
- Utwórz UNIKALNY INDEKS.
- I skopiuj dane z powrotem za pomocą
INSERT IGNORE
(który jest nadal dostępny).
CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;
Zobacz także:INSERT ... SELECT Składnia oraz Porównanie słowa kluczowego IGNORE i Ścisły tryb SQL