Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Mengapa pernyataan INSERT saya melewatkan 56 angka saat menaikkan id secara otomatis?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Haruskah MEDIUMINT dihindari di MySQL?

  2. Memperbarui dari MYSQL ke MYSQLI

  3. baca bingkai dengan sqlalchemy, mysql, dan pandas

  4. Masukkan Ya atau Tidak ke MySQL berdasarkan nilai kotak centang

  5. Bagaimana cara mengubah kueri MYSQL menjadi kueri MSSQL