MySQL: la TABLE ALTER IGNORE donne " Violation de la 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 dit:

IGNORE est une extension MySQL au SQL standard. Il contrôle le fonctionnement D'ALTER TABLE s'il y a des doublons sur des touches 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 annulée et retournée si des erreurs de clés en double se produisent. Si IGNORE est spécifié, seul le la première rangée est utilisée de rangées avec des doublons sur une clé unique. Les autres lignes en conflit sont supprimées. Les valeurs incorrectes sont tronquées à la valeur acceptable la plus proche.

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

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

... J'obtiens toujours l'erreur #1062-Duplicate entry 'blabla' pour la clé 'dupidx ' .

47
demandé sur Benjamin 2011-11-08 20:07:42

3 réponses

l'extension du mot-clé IGNORE à MySQL semble avoir un bug dans la version InnoDB sur une certaine version de MySQL.

, Vous pouvez toujours convertir au format MyISAM, IGNOREZ-AJOUTER l'index et ensuite de les convertir en arrière pour InnoDB

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

Note, Si vous avez des contraintes de clé étrangère cela ne marchera pas, vous devrez les supprimer d'abord, et les ajouter plus tard.

95
répondu Emma 2013-02-16 19:25:17

ou essayez la session set old_alter_table=1 (N'oubliez pas de la désactiver!)

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

26
répondu Jay Julian Payne 2013-07-31 14:28:28

le problème est que vous avez des données dupliquées dans le champ que vous essayez d'indexer. Vous devrez supprimer les doublons offensants avant de pouvoir ajouter un index unique.

est Une façon 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 seulement les données uniques dans le tableau

3
répondu Glen Solsberry 2011-11-08 17:02:57