Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:Защо моят оператор INSERT пропуска 56 числа при автоматично увеличаване на идентификатора?

Това поведение има нещо общо с "групови вмъквания" и 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли MySQL.. INSERT ... ON DUPLICATE KEY SELECT?

  2. изображенията са качени, но не мога да ги видя

  3. Как да стартирате mysqladmin flush-hosts на Amazon RDS

  4. Импортиране на wikipedia-dump в SQL-база

  5. Pandas Писане на таблица в MySQL:не може да се върне назад