To zachowanie ma coś wspólnego z "wstawianie zbiorcze"
oraz innodb_autoinc_lock_mode
ustawienie.
O ile rozumiem (dokumentacja nie jest na ten temat całkiem jasna), gdy używasz INSERT INTO ... SELECT
instrukcji, MySQL nie może wiedzieć, ile wierszy jest faktycznie wstawianych przed uruchomieniem zapytania, ale identyfikatory dla nowych wartości AUTO_INCREMENT muszą być zarezerwowane przy użyciu innodb_autoinc_lock_mode=1
(kolejne) lub 2
(z przeplotem). Z moich obserwacji rezerwuje zestaw liczb AUTO_INCREMENT, gdzie liczba jest potęgą 2 (nie mogę tego potwierdzić, tylko przypuszczenie). Zobacz następujący przykład:
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;
Spowoduje to wygenerowanie następującego wyniku:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Podczas wstawiania 5 wierszy z tabeli źródłowej rezerwuje kolejne 8 możliwych wartości AUTO_INCREMENT, ponieważ jest to najbliższa potęga liczby 2 większa niż 5. Jednak użyje tylko 5 z nich, ponieważ wstawiasz tylko 5 wierszy.
W twoim przypadku wstawiasz 200 wierszy, więc najbliższa potęga liczby 2 większej niż 200 będzie równa 256. Masz więc „lukę” 56 brakujących wartości AUTO_INCREMENT, a następny wpis otrzymuje identyfikator 256.