sql >> Database >  >> RDS >> Mysql

MySQL:Waarom slaat mijn INSERT-instructie 56 nummers over bij het automatisch verhogen van de id?

Dit gedrag heeft iets te maken met "bulk inserts" en de innodb_autoinc_lock_mode instelling.

Voor zover ik het begrijp (de documentatie is hier niet helemaal duidelijk over), wanneer je een INSERT INTO ... SELECT gebruikt statement, MySQL kan niet weten hoeveel rijen daadwerkelijk worden ingevoegd voordat de query wordt uitgevoerd, maar de ID's voor de nieuwe AUTO_INCREMENT-waarden moeten worden gereserveerd bij gebruik van innodb_autoinc_lock_mode=1 (opeenvolgend) of 2 (tussengevoegd). Van mijn observatie reserveert het een reeks AUTO_INCREMENT-getallen waarbij de telling een macht van 2 is (kan dit niet bevestigen, alleen een gok). Zie het volgende voorbeeld:

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;

Dit zal de volgende output genereren:

+----+----------+
| id | original |
+----+----------+
|  1 | one      |
|  2 | two      |
|  3 | three    |
|  4 | four     |
|  5 | five     |
|  8 | manual   |
+----+----------+

Bij het invoegen van de 5 rijen uit de brontabel, reserveert het de volgende 8 mogelijke AUTO_INCREMENT-waarden omdat dat de dichtstbijzijnde macht is van 2 getallen groter dan 5. Het zal er echter maar 5 van gebruiken omdat u slechts 5 rijen invoegt.

In jouw geval voeg je 200 rijen in, dus de dichtstbijzijnde macht van 2 die groter is dan 200 zou 256 zijn. Je hebt dus een "gat" van 56 ontbrekende AUTO_INCREMENT-waarden en de volgende invoer krijgt de ID 256.




  1. mysql alleen invoegen als niet bestaat werkt niet

  2. PHP-kalender met terugkerende evenementen uit de MySQL-database

  3. connect ECONNREFUSED - node js , sql

  4. een database maken op MySQL, hoe kan ik een query maken met kansen?