sql >> Databáze >  >> RDS >> Mysql

MySQL:Proč můj příkaz INSERT přeskočí 56 čísel při automatickém zvýšení id?

Toto chování má něco společného s "hromadné vkládání" a innodb_autoinc_lock_mode nastavení.

Pokud tomu rozumím (dokumentace v tom není zcela jasná), když použijete INSERT INTO ... SELECT MySQL nemůže před spuštěním dotazu vědět, kolik řádků se skutečně vkládá, ale ID pro nové hodnoty AUTO_INCREMENT musí být rezervovány při použití innodb_autoinc_lock_mode=1 (po sobě jdoucí) nebo 2 (prokládané). Z mého pozorování si vyhrazuje sadu čísel AUTO_INCREMENT, kde počet je mocninou 2 (nemohu to potvrdit, pouze odhad). Viz následující příklad:

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;

Tím se vygeneruje následující výstup:

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

Při vkládání 5 řádků ze zdrojové tabulky si rezervuje dalších 8 možných hodnot AUTO_INCREMENT, protože to je nejbližší mocnina čísla 2 větší než 5. Použije však pouze 5 z nich, protože vložíte pouze 5 řádků.

Ve vašem případě vkládáte 200 řádků, takže nejbližší mocnina čísla 2 větší než 200 by byla 256. Máte tedy „mezera“ 56 chybějících hodnot AUTO_INCREMENT a další položka získá ID 256.




  1. vztah mnoho k mnoha

  2. Jak urychlit vkládání z pandas.DataFrame .to_sql

  3. Dotaz read_sql vrací prázdný datový rámec poté, co předám parametry jako dict v python pandas

  4. Vynechání dvojité uvozovky pro dotaz na PostgreSQL