Se hai duplicati nella tua tabella e usi
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
la query avrà esito negativo con errore 1062 (chiave duplicata).
Ma se usi IGNORE
-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
i duplicati verranno rimossi. Ma la documentazione non specifica quale riga verrà conservata:
Se la tua versione è 5.7.4 o successiva, puoi:
- Copia i dati in una tabella temporanea (tecnicamente non deve essere temporanea).
- Tronca la tabella originale.
- Crea l'INDICE UNICO.
- E copia nuovamente i dati con
INSERT IGNORE
(che è ancora disponibile).
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;
Vedi anche:INSERT ... SELECT Sintassi e Confronto tra la parola chiave IGNORE e Modalità SQL rigorosa