Énigme ON DUPLICATE KEY UPDATE : anomalie d'incrémentation automatique
Lors de l'utilisation de la clause ON DUPLICATE KEY UPDATE dans une instruction INSERT, vous pouvez rencontrer un comportement inattendu avec les valeurs d'incrémentation automatique. L'insertion d'une nouvelle ligne qui déclenche la clause ON DUPLICATE KEY peut entraîner un incrément particulier dans la valeur d'incrémentation automatique. Cet article examine la cause et propose une solution.
Comprendre le mécanisme
Comme documenté par MySQL, lorsque ON DUPLICATE KEY UPDATE est spécifié, une valeur de clé en double dans un index UNIQUE ou PRIMARY KEY déclenche une MISE À JOUR de la ligne existante. Cette opération est analogue à une instruction UPDATE.
Cependant, une différence cruciale survient lors de l'utilisation de colonnes à incrémentation automatique dans les tables InnoDB. Contrairement aux instructions INSERT qui incrémentent automatiquement les colonnes à incrémentation automatique, les instructions UPDATE n'affectent pas leurs valeurs.
Implications de ON DUPLICATE KEY
Dans notre exemple, MySQL tente une INSERT opération en premier, ce qui incrémente la valeur d’auto-incrémentation. Par la suite, la clé en double est détectée et la MISE À JOUR se produit. Cependant, la valeur d'auto-incrémentation définie lors de l'INSERT n'est pas mise à jour. Cela entraîne une incrémentation incohérente dans la colonne d'incrémentation automatique.
Recours à l'incrémentation automatique
Il est important d'éviter de s'appuyer sur des valeurs d'incrémentation automatique pour maintenir une séquence. Les valeurs d'auto-incrémentation MySQL peuvent connaître des écarts en raison du mécanisme décrit ci-dessus. Pour les applications nécessitant des valeurs séquentielles, une approche plus laborieuse impliquant des verrous et une renumérotation à l'aide de déclencheurs est nécessaire.
Solution alternative
Une solution préférable consiste à calculer et à générer des valeurs incrémentielles. valeurs. Cela garantit des valeurs séquentielles sans les complexités et les performances associées au verrouillage et à la renumérotation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!