Toto chování má něco společného s "hromadné vkládání"
a innodb_autoinc_lock_mode
nastavení.
Pokud tomu rozumím (dokumentace v tom není zcela jasná), když použijete INSERT INTO ... SELECT
MySQL nemůže před spuštěním dotazu vědět, kolik řádků se skutečně vkládá, ale ID pro nové hodnoty AUTO_INCREMENT musí být rezervovány při použití innodb_autoinc_lock_mode=1
(po sobě jdoucí) nebo 2
(prokládané). Z mého pozorování si vyhrazuje sadu čísel AUTO_INCREMENT, kde počet je mocninou 2 (nemohu to potvrdit, pouze odhad). Viz následující příklad:
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;
Tím se vygeneruje následující výstup:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Při vkládání 5 řádků ze zdrojové tabulky si rezervuje dalších 8 možných hodnot AUTO_INCREMENT, protože to je nejbližší mocnina čísla 2 větší než 5. Použije však pouze 5 z nich, protože vložíte pouze 5 řádků.
Ve vašem případě vkládáte 200 řádků, takže nejbližší mocnina čísla 2 větší než 200 by byla 256. Máte tedy „mezera“ 56 chybějících hodnot AUTO_INCREMENT a další položka získá ID 256.