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.