47 votes

MySQL: ALTER IGNORE TABLE donne une "violation de contrainte d'intégrité"

Je suis en train de supprimer les doublons d'une table MySQL à l'aide de ALTER IGNORER TABLE + une CLÉ UNIQUE. La documentation de MySQL dit:

L'IGNORER est une extension MySQL de la norme SQL. Il contrôle la façon dont réagit si il y a des doublons sur les clés uniques dans la nouvelle table ou si les avertissements se produire lorsque le mode strict est activé. Si l'IGNORER n'est pas spécifié, la copie est annulée et restauré lorsque vous double-clés des erreurs se produisent. Si l'IGNORER est spécifiée, seule la première ligne est utilisé pour les lignes avec des doublons sur une clé unique. L'autre conflit lignes sont supprimées. Des valeurs incorrectes sont tronqués correspondant le plus proche valeur acceptable.

Lorsque j'exécute la requête ...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

... J'ai toujours l'erreur #1062 - Duplicate entry 'blabla' for key 'dupidx'.

Merci pour votre aide!

96voto

Emma Points 1023

L'extension de mot-clé IGNORE de MySQL semble présenter un bogue dans la version de InnoDB sur certaines versions de MySQL.

Vous pouvez toujours, convertir en MyISAM, IGNORE-ADD l'index puis reconvertir en InnoDB

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

Notez que si vous avez des contraintes de clé étrangère, cela ne fonctionnera pas, vous devrez d'abord les supprimer, puis les rajouter plus tard.

26voto

Jay Julian Payne Points 158

Ou essayez set session old_alter_table = 1 (n'oubliez pas de le remettre!)

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 incriminés avant de pouvoir ajouter un index unique.

Une façon 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: