Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Warum überspringt meine INSERT-Anweisung 56 Zahlen, wenn die ID automatisch erhöht wird?

Dieses Verhalten hat etwas mit "Masseneinfügungen" und der innodb_autoinc_lock_mode Einstellung.

Soweit ich es verstehe (die Dokumentation ist diesbezüglich nicht ganz klar), wenn Sie ein INSERT INTO ... SELECT verwenden -Anweisung kann MySQL nicht wissen, wie viele Zeilen tatsächlich eingefügt werden, bevor die Abfrage ausgeführt wird, aber die IDs für die neuen AUTO_INCREMENT-Werte müssen reserviert werden, wenn innodb_autoinc_lock_mode=1 verwendet wird (fortlaufend) oder 2 (verschachtelt). Nach meiner Beobachtung reserviert es eine Reihe von AUTO_INCREMENT-Zahlen, bei denen die Zählung eine Potenz von 2 ist (kann dies nicht bestätigen, nur eine Vermutung). Siehe folgendes Beispiel:

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;

Dies erzeugt die folgende Ausgabe:

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

Beim Einfügen der 5 Zeilen aus der Quelltabelle werden die nächsten 8 möglichen AUTO_INCREMENT-Werte reserviert, da dies die nächste Potenz von 2 ist, die größer als 5 ist. Es werden jedoch nur 5 davon verwendet, da Sie nur 5 Zeilen einfügen.

In Ihrem Fall fügen Sie 200 Zeilen ein, also wäre die nächste Potenz von 2 eine Zahl größer als 200 256. Sie haben also eine „Lücke“ von 56 fehlenden AUTO_INCREMENT-Werten und der nächste Eintrag erhält die ID 256.