Je suis très perturbé par ce comportement étrange que je constate dans la auto_increment
valeur enregistrée dans le bidID d'une table Bids après avoir effectué une insertion en bloc à l'aide d'une procédure stockée:
INSERT INTO Bids (itemID, buyerID, bidPrice)
SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
FROM Items
WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;
Par exemple, si la auto_increment
valeur bidID est 101 au début et que j'ai inséré 100 lignes, la valeur de fin devient 213 au lieu de 201. Cependant, les bidID de ces lignes insérées s'exécutent séquentiellement jusqu'à un maximum de 201.
Après avoir vérifié les éléments suivants,
SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
Je ne sais pas pourquoi cela se produit. Qu'est-ce qui pourrait provoquer le saut de la auto increment
valeur?
mysql
innodb
mariadb
auto-increment
Débordement de question
la source
la source
show variables like '%innodb_autoinc_lock_mode%';
sortie?Réponses:
Ce n'est pas inhabituel et il y a deux ou trois causes. Parfois, cela est dû aux optimisations effectuées par le programme d'exécution de requêtes pour réduire les problèmes de contention avec la ressource de compteur, améliorant ainsi l'efficacité en cas de mises à jour simultanées de la table affectée. Parfois, cela est dû à des transactions qui ont été annulées explicitement (ou annulées implicitement en raison d'une erreur).
La seule garantie d'une
auto_increment
colonne (ouIDENTITY
en MSSQL, et les autres noms utilisés par le concept) est que chaque valeur sera unique et jamais plus petite qu'une précédente: vous pouvez donc vous fier aux valeurs de commande, mais vous ne pouvez pas vous fier à pour qu'ils n'aient pas de lacunes.Si vous avez besoin que les valeurs de la colonne ne comportent aucune lacune, vous devrez gérer les valeurs vous-même, soit dans une autre couche de logique métier, soit dans la base de données via un déclencheur (faites cependant attention aux problèmes de performances potentiels avec les déclencheurs), bien sûr si vous roulez vous-même, vous devrez faire face à tous les problèmes de concurrence / restauration / nettoyage après suppression / autres que les moteurs de base de données contournent en autorisant des écarts).
la source