Това поведение има нещо общо с "групови вмъквания"
и innodb_autoinc_lock_mode
настройка.
Доколкото разбирам (документацията не е съвсем ясна за това), когато използвате INSERT INTO ... SELECT
декларация, MySQL не може да знае колко реда действително се вмъкват, преди да изпълни заявката, но идентификаторите за новите стойности AUTO_INCREMENT трябва да бъдат запазени, когато се използва innodb_autoinc_lock_mode=1
(последователен) или 2
(преплитане). От моите наблюдения той запазва набор от числа AUTO_INCREMENT, където броят е степен на 2 (не мога да потвърдя това, само предположение). Вижте следния пример:
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;
Това ще генерира следния резултат:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Когато вмъква 5-те реда от изходната таблица, той запазва следващите 8 възможни стойности AUTO_INCREMENT, защото това е най-близката степен на число 2, по-голямо от 5. Въпреки това, той ще използва само 5 от тях, тъй като вмъквате само 5 реда.
Във вашия случай вмъквате 200 реда, така че най-близката степен на число 2, по-голяма от 200, ще бъде 256. Така че имате „празнина“ от 56 липсващи стойности AUTO_INCREMENT и следващият запис получава ID 256.