sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Varför hoppar min INSERT-sats över 56 siffror när jag automatiskt ökar ID:t?

Detta beteende har något att göra med "bulk-inlägg" och innodb_autoinc_lock_mode inställning.

Såvitt jag förstår det (dokumentationen är inte helt tydlig om detta), när du använder en INSERT INTO ... SELECT kan MySQL inte veta hur många rader som faktiskt infogas innan frågan körs, men ID:n för de nya AUTO_INCREMENT-värdena måste reserveras när du använder innodb_autoinc_lock_mode=1 (konsekutiv) eller 2 (interfolierad). Från min observation reserverar den en uppsättning AUTO_INCREMENT-tal där räkningen är en potens av 2 (kan inte bekräfta detta, bara en gissning). Se följande exempel:

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;

Detta kommer att generera följande utdata:

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

När du infogar de 5 raderna från källtabellen reserverar den nästa 8 möjliga AUTO_INCREMENT-värden eftersom det är den närmaste potensen av 2-tal större än 5. Den kommer dock bara att använda 5 av dem eftersom du bara infogar 5 rader.

I ditt fall infogar du 200 rader, så den närmaste potensen av 2 tal större än 200 skulle vara 256. Så du har ett "gap" på 56 saknade AUTO_INCREMENT-värden och nästa post får ID 256.




  1. Enkel IF.. Else.. mysql-fråga

  2. Vad är effekten av att ändra längden på en varchar i mysql?

  3. LADDA DATAINFIL endast 1 post har infogats

  4. Infoga flera rader i en MySQL-databas från en tabell