sql >> Base de Datos >  >> RDS >> Mysql

MySQL:¿Por qué mi declaración INSERT omite 56 números cuando incrementa automáticamente la identificación?

Este comportamiento tiene algo que ver con "inserciones masivas" y el innodb_autoinc_lock_mode ajuste.

Según tengo entendido (la documentación no es muy clara al respecto), cuando usas INSERT INTO ... SELECT MySQL no puede saber cuántas filas se están insertando realmente antes de ejecutar la consulta, pero los ID para los nuevos valores AUTO_INCREMENT deben reservarse cuando se usa innodb_autoinc_lock_mode=1 (consecutivos) o 2 (entrelazado). Desde mi observación, reserva un conjunto de números AUTO_INCREMENT donde el conteo es una potencia de 2 (no puedo confirmar esto, solo una conjetura). Vea el siguiente ejemplo:

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;

Esto generará el siguiente resultado:

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

Al insertar las 5 filas de la tabla de origen, reserva los siguientes 8 valores AUTO_INCREMENT posibles porque esa es la potencia de 2 más cercana a un número mayor que 5. Sin embargo, usará solo 5 de ellos ya que insertas solo 5 filas.

En su caso, está insertando 200 filas, por lo que la potencia más cercana de 2 números mayor que 200 sería 256. Entonces tiene una "brecha" de 56 valores AUTO_INCREMENT faltantes y la siguiente entrada obtiene el ID 256.