web-dev-qa-db-fra.com

Pourquoi l'incrémentation automatique saute-t-elle de plus que le nombre de lignes insérées?

Je suis très perturbé par ce comportement étrange que je vois dans le auto_increment valeur enregistrée dans le bidID d'une table d'enchères 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 le auto_increment la valeur bidID est 101 au début, et 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 dans le auto increment valeur?

11

Ce n'est pas inhabituel et il y a deux ou trois causes. Parfois, cela est dû aux optimisations que le programme d'exécution de requêtes effectue 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).

Les seules garanties d'un auto_increment colonne (ou IDENTITY dans MSSQL, et les autres noms utilisés par le concept) est que chaque valeur sera unique et jamais plus petite que la précédente: vous pouvez donc vous fier aux valeurs pour la commande mais vous pouvez ne comptez pas sur eux pour ne pas avoir 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 ou dans la base de données via un déclencheur (faites 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).

10
David Spillett