Dieses Verhalten hat etwas mit "Masseneinfügungen"
und der innodb_autoinc_lock_mode
Einstellung.
Soweit ich es verstehe (die Dokumentation ist diesbezüglich nicht ganz klar), wenn Sie ein INSERT INTO ... SELECT
verwenden -Anweisung kann MySQL nicht wissen, wie viele Zeilen tatsächlich eingefügt werden, bevor die Abfrage ausgeführt wird, aber die IDs für die neuen AUTO_INCREMENT-Werte müssen reserviert werden, wenn innodb_autoinc_lock_mode=1
verwendet wird (fortlaufend) oder 2
(verschachtelt). Nach meiner Beobachtung reserviert es eine Reihe von AUTO_INCREMENT-Zahlen, bei denen die Zählung eine Potenz von 2 ist (kann dies nicht bestätigen, nur eine Vermutung). Siehe folgendes Beispiel:
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;
Dies erzeugt die folgende Ausgabe:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Beim Einfügen der 5 Zeilen aus der Quelltabelle werden die nächsten 8 möglichen AUTO_INCREMENT-Werte reserviert, da dies die nächste Potenz von 2 ist, die größer als 5 ist. Es werden jedoch nur 5 davon verwendet, da Sie nur 5 Zeilen einfügen.
In Ihrem Fall fügen Sie 200 Zeilen ein, also wäre die nächste Potenz von 2 eine Zahl größer als 200 256. Sie haben also eine „Lücke“ von 56 fehlenden AUTO_INCREMENT-Werten und der nächste Eintrag erhält die ID 256.