Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Pourquoi mon instruction INSERT saute-t-elle 56 numéros lors de l'incrémentation automatique de l'identifiant ?

Ce comportement a quelque chose à voir avec "insertions en masse" et le innodb_autoinc_lock_mode réglage.

Autant que je sache (la documentation n'est pas très claire à ce sujet), lorsque vous utilisez un INSERT INTO ... SELECT , MySQL ne peut pas savoir combien de lignes sont réellement insérées avant d'exécuter la requête, mais les ID des nouvelles valeurs AUTO_INCREMENT doivent être réservés lors de l'utilisation de innodb_autoinc_lock_mode=1 (consécutif) ou 2 (entrelacé). D'après mon observation, il réserve un ensemble de nombres AUTO_INCREMENT où le nombre est une puissance de 2 (ne peut pas le confirmer, seulement une supposition). Voir l'exemple suivant :

CREATE TABLE sourceTable(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20)
);

CREATE TABLE targetTable(
    id INT AUTO_INCREMENT PRIMARY KEY,
    original VARCHAR(30)
);

INSERT INTO sourceTable(name) VALUES ('one');
INSERT INTO sourceTable(name) VALUES ('two');
INSERT INTO sourceTable(name) VALUES ('three');
INSERT INTO sourceTable(name) VALUES ('four');
INSERT INTO sourceTable(name) VALUES ('five');

INSERT INTO targetTable(original) SELECT name FROM sourceTable;

INSERT INTO targetTable(original) VALUES ('manual');

SELECT * FROM targetTable;

Cela générera la sortie suivante :

+----+----------+
| id | original |
+----+----------+
|  1 | one      |
|  2 | two      |
|  3 | three    |
|  4 | four     |
|  5 | five     |
|  8 | manual   |
+----+----------+

Lors de l'insertion des 5 lignes de la table source, il réserve les 8 prochaines valeurs AUTO_INCREMENT possibles car il s'agit de la puissance de 2 la plus proche supérieure à 5. Cependant, il n'en utilisera que 5 puisque vous n'insérez que 5 lignes.

Dans votre cas, vous insérez 200 lignes, donc la puissance de 2 la plus proche supérieure à 200 serait 256. Vous avez donc un "écart" de 56 valeurs AUTO_INCREMENT manquantes et l'entrée suivante obtient l'ID 256.