Maison >base de données >tutoriel mysql >Pourquoi le comportement d'incrémentation automatique de MySQL change-t-il avec « ON DUPLICATE KEY UPDATE » ?
Anomalies d'incrémentation automatique avec ON DUPLICATE KEY
Dans MySQL, lors de l'utilisation de l'instruction INSERT ... ON DUPLICATE KEY UPDATE, un comportement inattendu peut surgissent avec des colonnes à incrémentation automatique. Ce problème vient du fait que MySQL tente d'effectuer l'insertion en premier, provoquant l'incrémentation de l'identifiant. Par la suite, lorsque le doublon est détecté, la mise à jour se produit sans affecter la valeur de l'identifiant.
Explication :
Selon la documentation MySQL, si une valeur en double est détectée dans un index unique ou clé primaire lors d'une insertion avec ON DUPLICATE KEY UPDATE, MySQL exécute une mise à jour sur l'ancienne ligne. Bien que ce comportement soit similaire à une instruction UPDATE, il existe une différence cruciale lorsqu'il s'agit de colonnes à incrémentation automatique dans les tables InnoDB.
Dans de tels cas, l'instruction INSERT incrémente la valeur d'incrémentation automatique, tandis que l'UPDATE suivante ce n'est pas le cas. Cela entraîne un écart entre la valeur d'auto-incrémentation et le nombre réel de lignes dans le tableau.
Solution :
Il est important de reconnaître que les séquences d'auto-incrémentation ne sont pas toujours contigus. Si les écarts dans la séquence sont inacceptables, une solution plus complexe est requise, impliquant généralement le verrouillage des tables et des déclencheurs pour recalculer les valeurs incrémentielles. Cependant, pour la plupart des scénarios, il n'est pas conseillé de s'appuyer sur des séquences d'auto-incrémentation ininterrompues.
Envisagez plutôt de calculer des valeurs incrémentielles côté sortie pour garantir la cohérence. Cette approche élimine le recours aux colonnes à incrémentation automatique et permet des insertions et des mises à jour plus efficaces.
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!