Maison >base de données >tutoriel mysql >Comment empêcher l'incrémentation automatique d'InnoDB lors des mises à jour de clés en double ?

Comment empêcher l'incrémentation automatique d'InnoDB lors des mises à jour de clés en double ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-15 06:20:03264parcourir

How to Prevent InnoDB Auto Incrementing on Duplicate Key Updates?

Contrôle d'incrémentation automatique InnoDB sur les clés en double

Le moteur InnoDB de MySQL fournit une fonctionnalité de clé primaire à incrémentation automatique pour les tables, générant automatiquement des identifiants uniques pour chaque rangée. Cependant, par défaut, InnoDB incrémente également la clé primaire lors des mises à jour de clés en double, ce qui conduit à des valeurs non consécutives.

Éviter l'incrémentation automatique sur les doublons

Pour éviter ce problème et conservez des valeurs d'incrémentation automatique consécutives, vous pouvez modifier l'option de configuration innodb_autoinc_lock_mode. En le définissant sur "0", vous passez au mode de verrouillage par incrémentation automatique "traditionnel", qui garantit que des valeurs consécutives sont attribuées aux colonnes AUTO_INCREMENT même pour les mises à jour de clés en double.

Configuration automatique d'InnoDB Mode incrémental

Définissez la valeur innodb_autoinc_lock_mode dans votre fichier de configuration MySQL, généralement situé dans /etc/my.cnf ou /my.ini.

[mysqld]
innodb_autoinc_lock_mode=0

Structure de la table et exemple de requête

La structure de votre table et votre requête dans le contexte fourni sont les suivantes :

CREATE TABLE IF NOT EXISTS `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` varchar(200) NOT NULL,
  `field2` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `field1` (`field1`),
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

INSERT INTO table ( field1, field2 ) VALUES (:value1, :value2)
            ON DUPLICATE KEY
            UPDATE field1 = :value1, field2 = :value2 

Avec innodb_autoinc_lock_mode défini sur "0", cette requête mettra à jour les enregistrements en double sans incrémenter la colonne id, garantissant des valeurs consécutives pour les nouvelles insertions.

Attention :

Notez que s'appuyer sur des ID d'auto-incrémentation consécutifs dans votre application n'est pas une bonne pratique. Les valeurs à incrémentation automatique sont destinées à fournir des identifiants uniques et ne doivent pas être utilisées à des fins de commande ou de tri.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn