Si vous avez des doublons dans votre table et que vous utilisez
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
la requête échouera avec l'erreur 1062 (clé en double).
Mais si vous utilisez IGNORE
-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
les doublons seront supprimés. Mais la documentation ne précise pas quelle ligne sera conservée :
Si votre version est 5.7.4 ou supérieure, vous pouvez :
- Copiez les données dans une table temporaire (il n'est techniquement pas nécessaire qu'elle soit temporaire).
- Tronquer le tableau d'origine.
- Créer l'INDEX UNIQUE.
- Et recopiez les données avec
INSERT IGNORE
(qui est toujours disponible).
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;
Voir aussi :INSERT ... SELECT Syntaxe et Comparaison du mot clé IGNORE et Mode SQL strict