Esse comportamento tem algo a ver com "inserções em massa" e o
innodb_autoinc_lock_mode
contexto. Pelo que entendi (a documentação não é muito clara sobre isso), quando você usa um
INSERT INTO ... SELECT
instrução, o MySQL não pode saber quantas linhas estão realmente sendo inseridas antes de executar a consulta, mas os IDs para os novos valores AUTO_INCREMENT devem ser reservados ao usar innodb_autoinc_lock_mode=1
(consecutivo) ou 2
(intercalado). Pela minha observação, ele reserva um conjunto de números AUTO_INCREMENT onde a contagem é uma potência de 2 (não posso confirmar isso, apenas um palpite). Veja o seguinte exemplo: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;
Isso gerará a seguinte saída:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Ao inserir as 5 linhas da tabela de origem, ele reserva os próximos 8 valores AUTO_INCREMENT possíveis porque essa é a potência mais próxima de 2 número maior que 5. No entanto, ele usará apenas 5 deles, pois você inserirá apenas 5 linhas.
No seu caso, você está inserindo 200 linhas, então a potência mais próxima de 2 número maior que 200 seria 256. Então você tem um "gap" de 56 valores AUTO_INCREMENT ausentes e a próxima entrada obtém o ID 256.