Perilaku ini ada hubungannya dengan "sisipan massal"
dan innodb_autoinc_lock_mode
pengaturan.
Sejauh yang saya pahami (dokumentasi tidak cukup jelas tentang ini), ketika Anda menggunakan INSERT INTO ... SELECT
pernyataan, MySQL tidak dapat mengetahui berapa banyak baris yang sebenarnya dimasukkan sebelum menjalankan kueri, tetapi ID untuk nilai AUTO_INCREMENT baru harus dicadangkan saat menggunakan innodb_autoinc_lock_mode=1
(berturut-turut) atau 2
(interleaving). Dari pengamatan saya, ia menyimpan satu set angka AUTO_INCREMENT di mana hitungannya adalah kekuatan 2 (tidak dapat mengkonfirmasi ini, hanya tebakan). Lihat contoh berikut:
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;
Ini akan menghasilkan output berikut:
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
Saat menyisipkan 5 baris dari tabel sumber, ia menyimpan 8 kemungkinan nilai AUTO_INCREMENT berikutnya karena itu adalah pangkat terdekat dari 2 angka yang lebih besar dari 5. Namun, itu hanya akan menggunakan 5 karena Anda hanya menyisipkan 5 baris.
Dalam kasus Anda, Anda memasukkan 200 baris, jadi pangkat terdekat dari 2 angka yang lebih besar dari 200 adalah 256. Jadi, Anda memiliki "celah" 56 nilai AUTO_INCREMENT yang hilang dan entri berikutnya mendapatkan ID 256.