Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:Por que minha instrução INSERT pula 56 números ao incrementar automaticamente o id?


Esse comportamento tem algo a ver com "inserções em massa" e o innodb_autoinc_lock_mode contexto.

Pelo que entendi (a documentação não é muito clara sobre isso), quando você usa um INSERT INTO ... SELECT instrução, o MySQL não pode saber quantas linhas estão realmente sendo inseridas antes de executar a consulta, mas os IDs para os novos valores AUTO_INCREMENT devem ser reservados ao usar innodb_autoinc_lock_mode=1 (consecutivo) ou 2 (intercalado). Pela minha observação, ele reserva um conjunto de números AUTO_INCREMENT onde a contagem é uma potência de 2 (não posso confirmar isso, apenas um palpite). Veja o seguinte exemplo:
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;

Isso gerará a seguinte saída:
+----+----------+
| id | original |
+----+----------+
|  1 | one      |
|  2 | two      |
|  3 | three    |
|  4 | four     |
|  5 | five     |
|  8 | manual   |
+----+----------+

Ao inserir as 5 linhas da tabela de origem, ele reserva os próximos 8 valores AUTO_INCREMENT possíveis porque essa é a potência mais próxima de 2 número maior que 5. No entanto, ele usará apenas 5 deles, pois você inserirá apenas 5 linhas.

No seu caso, você está inserindo 200 linhas, então a potência mais próxima de 2 número maior que 200 seria 256. Então você tem um "gap" de 56 valores AUTO_INCREMENT ausentes e a próxima entrada obtém o ID 256.