Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:Dlaczego moja instrukcja INSERT pomija 56 liczb podczas automatycznego zwiększania identyfikatora?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak naprawić InterfaceError:2003:Nie można połączyć się z serwerem MySQL na '127.0.0.1:3306:3306' (nie powiodło się 11001 getaddrinfo)

  2. PHP MySQL Kolejność według wielu kolumn

  3. Znaki inne niż angielskie w bazie danych przy użyciu języka Java

  4. Przesyłanie obrazów w CKEditor bez użycia wtyczki

  5. Ostrzeżenie:mysql_num_rows() oczekuje, że parametr 1 będzie zasobem, wartość logiczna podana w /home/folder/public_html/folder/folder/login.php w wierszu 18