Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:perché la mia istruzione INSERT salta 56 numeri quando si incrementa automaticamente l'id?

Questo comportamento ha qualcosa a che fare con "inserimenti in blocco" e innodb_autoinc_lock_mode impostazione.

Per quanto ho capito (la documentazione non è del tutto chiara su questo), quando usi un INSERT INTO ... SELECT MySQL non può sapere quante righe vengono effettivamente inserite prima di eseguire la query, ma gli ID per i nuovi valori AUTO_INCREMENT devono essere riservati quando si utilizza innodb_autoinc_lock_mode=1 (consecutivo) o 2 (intercalato). Dalla mia osservazione si riserva un insieme di numeri AUTO_INCREMENT in cui il conteggio è una potenza di 2 (non posso confermarlo, solo un'ipotesi). Vedi il seguente esempio:

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;

Questo genererà il seguente output:

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

Quando si inseriscono le 5 righe dalla tabella di origine, si riservano i successivi 8 possibili valori AUTO_INCREMENT perché questa è la potenza più vicina di 2 numeri maggiore di 5. Tuttavia, ne utilizzerà solo 5 poiché si inseriscono solo 5 righe.

Nel tuo caso, stai inserendo 200 righe, quindi la potenza più vicina di 2 numeri maggiore di 200 sarebbe 256. Quindi hai uno "spazio" di 56 valori AUTO_INCREMENT mancanti e la voce successiva ottiene l'ID 256.