Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi y a-t-il des lacunes dans les valeurs de ma colonne IDENTITY ?

La propriété d'identité sur une colonne ne garantit pas ce qui suit :

Unicité de la valeur – L'unicité doit être appliquée à l'aide d'une contrainte PRIMARY KEY ou UNIQUE ou d'un index UNIQUE.

Valeurs consécutives au sein d'une transaction – Une transaction insérant plusieurs lignes n'est pas garantie d'obtenir des valeurs consécutives pour les lignes car d'autres insertions simultanées peuvent se produire sur la table. Si les valeurs doivent être consécutives, la transaction doit utiliser un verrou exclusif sur la table ou utiliser le niveau d'isolation SERIALIZABLE.

Valeurs consécutives après le redémarrage du serveur ou d'autres échecs –SQL Server peut mettre en cache les valeurs d'identité pour des raisons de performances et certaines des valeurs affectées peuvent être perdues lors d'une défaillance de la base de données ou d'un redémarrage du serveur. Cela peut entraîner des lacunes dans la valeur d'identité lors de l'insertion. Si les écarts ne sont pas acceptables, l'application doit utiliser un générateur de séquence avec l'option NOCACHE ou utiliser son propre mécanisme pour générer des valeurs clés.

Réutilisation des valeurs – Pour une propriété d'identité donnée avec une graine/un incrément spécifique, les valeurs d'identité ne sont pas réutilisées par le moteur. Si une instruction d'insertion particulière échoue ou si l'instruction d'insertion est annulée, les valeurs d'identité consommées sont perdues et ne seront plus générées. Cela peut entraîner des écarts lorsque les valeurs d'identité suivantes sont générées.

Aussi,

Si une colonne d'identité existe pour une table avec des suppressions fréquentes, des écarts peuvent se produire entre les valeurs d'identité. Si cela pose problème, n'utilisez pas la propriété IDENTITY. Cependant, pour vous assurer qu'aucun vide n'a été créé ou pour combler un vide existant , évaluez les valeurs d'identité existantes avant d'en saisir explicitement une avec SET IDENTITY_INSERT ON .

Vérifiez également les propriétés de la colonne d'identité et vérifiez la valeur d'incrément d'identité. Il devrait être 1.