47 votes

MySQL : ALTER IGNORE TABLE donne "Integrity constraint violation" (violation de contrainte d'intégrité)

J'essaie de supprimer les doublons d'une table MySQL en utilisant ALTER IGNORE TABLE + une CLÉ UNIQUE. La documentation MySQL indique que :

IGNORE est une extension MySQL du SQL standard. Elle contrôle la façon dont ALTER TABLE fonctionne s'il y a des doublons sur des clés uniques dans la nouvelle table ou si des avertissements se produisent lorsque le mode strict est activé. Si IGNORE n'est pas spécifié, la copie est interrompue et annulée si des erreurs de duplication de clés se produisent. Si IGNORE est spécifié, seule la première ligne des lignes comportant des doublons sur une clé unique est utilisée. Les autres lignes en conflit sont supprimées. Les valeurs incorrectes sont tronquées à la valeur acceptable la plus proche.

Quand je lance la requête ...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

... Je reçois toujours l'erreur #1062 - Duplicata de l'entrée 'blabla' pour la clé 'dupidx'. .

96voto

Emma Points 1023

El IGNORE L'extension du mot-clé à MySQL semble avoir une bug dans la version InnoDB sur certaines versions de MySQL.

Vous pouvez toujours convertir en MyISAM, IGNORE-ADD l'index et ensuite reconvertir en InnoDB.

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Remarque : si vous avez des contraintes de clés étrangères, cela ne fonctionnera pas. Vous devrez d'abord les supprimer, puis les rajouter plus tard.

26voto

Jay Julian Payne Points 158

Ou essayez de définir la session old_alter_table=1 (N'oubliez pas de la remettre en place !).

Voir : http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/

3voto

Glen Solsberry Points 4756

Le problème est que vous avez des données en double dans le champ que vous essayez d'indexer. Vous devez supprimer les doublons en question avant de pouvoir ajouter un index unique.

Une façon de procéder est de faire ce qui suit :

   CREATE TABLE tmp_table LIKE table;
   ALTER IGNORE TABLE tmp_table ADD UNIQUE INDEX dupidx (field);
   INSERT IGNORE INTO tmp_table SELECT * FROM table;
   DROP TABLE table;
   RENAME TABLE tmp_table TO table;

cela vous permet d'insérer uniquement les données uniques dans la table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X