web-dev-qa-db-fra.com

MySQL: ALTER IGNORE TABLE ADD UNIQUE, qu'est-ce qui sera tronqué?

J'ai un tableau avec 4 colonnes: ID, type, propriétaire, description. L'ID est AUTO_INCREMENT PRIMARY KEY et maintenant je veux:

ALTER IGNORE TABLE `my_table`
    ADD UNIQUE (`type`, `owner`);

Bien sûr, j'ai quelques enregistrements avec type = 'Apple' et owner = 'Apple CO'. Donc, ma question est de savoir quel enregistrement sera le plus spécial pour rester après cette ALTER TABLE, celui avec le plus petit ID ou peut-être celui avec le plus grand comme dernier inséré?

30
kuba

Le premier enregistrement sera conservé, le reste sera supprimé §§ :

IGNORE est une extension MySQL du SQL standard. Il contrôle le fonctionnement d'ALTER TABLE s'il existe 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 abandonnée et annulée si des erreurs de clé en double se produisent. Si IGNORE est spécifié, seule la ligne en premier est utilisée pour les lignes contenant des doublons sur une clé unique. Les autres lignes en conflit sont supprimées. Les valeurs incorrectes sont tronquées à la valeur acceptable correspondante la plus proche

Je suppose que "premier" signifie ici celui avec le plus petit ID, en supposant que l'ID est la clé primaire.

Notez également:

Depuis MySQL 5.7.4, la clause IGNORE pour ALTER TABLE est supprimé et son utilisation génère une erreur.

44
Galz

Il semble que votre problème soit l'une des raisons mêmes pour lesquelles ALTER IGNORE a été déconseillé.

Ceci provient de notes MySQL sur la dépréciation ALTER IGNORE:

"Cette fonctionnalité est mal définie (quelle est la première ligne?), Provoque des problèmes de réplication, désactive la modification en ligne pour la création d'index unique et a causé des problèmes avec les clés étrangères (lignes supprimées dans la table parent) . "

0
Sally Levesque