Questo comportamento ha qualcosa a che fare con "inserimenti in blocco"
e innodb_autoinc_lock_mode
impostazione.
Per quanto ho capito (la documentazione non è del tutto chiara su questo), quando usi un INSERT INTO ... SELECT
MySQL non può sapere quante righe vengono effettivamente inserite prima di eseguire la query, ma gli ID per i nuovi valori AUTO_INCREMENT devono essere riservati quando si utilizza innodb_autoinc_lock_mode=1
(consecutivo) o 2
(intercalato). Dalla mia osservazione si riserva un insieme di numeri AUTO_INCREMENT in cui il conteggio è una potenza di 2 (non posso confermarlo, solo un'ipotesi). Vedi il seguente esempio:
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;
Questo genererà il seguente output:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Quando si inseriscono le 5 righe dalla tabella di origine, si riservano i successivi 8 possibili valori AUTO_INCREMENT perché questa è la potenza più vicina di 2 numeri maggiore di 5. Tuttavia, ne utilizzerà solo 5 poiché si inseriscono solo 5 righe.
Nel tuo caso, stai inserendo 200 righe, quindi la potenza più vicina di 2 numeri maggiore di 200 sarebbe 256. Quindi hai uno "spazio" di 56 valori AUTO_INCREMENT mancanti e la voce successiva ottiene l'ID 256.