sql >> Database teknologi >  >> RDS >> Mysql

MySQL:Hvorfor springer min INSERT-sætning 56 tal over, når id'et automatisk øges?

Denne adfærd har noget at gøre med "bulk inserts" og innodb_autoinc_lock_mode indstilling.

Så vidt jeg forstår det (dokumentationen er ikke helt klar omkring dette), når du bruger en INSERT INTO ... SELECT sætning, kan MySQL ikke vide, hvor mange rækker der rent faktisk indsættes, før forespørgslen køres, men ID'erne for de nye AUTO_INCREMENT-værdier skal reserveres, når du bruger innodb_autoinc_lock_mode=1 (konsekutiv) eller 2 (indflettet). Fra min observation reserverer den et sæt AUTO_INCREMENT-tal, hvor antallet er en potens af 2 (kan ikke bekræfte dette, kun et gæt). Se følgende eksempel:

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;
 

Dette vil generere følgende output:

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

Når du indsætter de 5 rækker fra kildetabellen, reserverer den de næste 8 mulige AUTO_INCREMENT-værdier, fordi det er den nærmeste potens af 2 tal større end 5. Den vil dog kun bruge 5 af dem, da du kun indsætter 5 rækker.

I dit tilfælde indsætter du 200 rækker, så den nærmeste potens af 2 tal større end 200 ville være 256. Så du har et "gab" på 56 manglende AUTO_INCREMENT-værdier, og den næste post får ID 256.




  1. Konverter varchar-kolonnen til dato i mysql på databaseniveau

  2. Hvordan COERCIBILITY() virker i MariaDB

  3. MySQL udenlandsk nøgle begrænsning forsvinder

  4. Hvordan indstiller man en kollation med mysqli?