web-dev-qa-db-fra.com

Réinitialiser la valeur IDENTITY

J'ai une table avec une colonne IDENTITY. Pendant le développement, je supprime les lignes de temps en temps et les ajoute à nouveau. Mais les valeurs IDENTITY ont toujours augmenté et n'ont pas commencé à partir de 1 lorsque je les ai ajoutées à nouveau. Maintenant, mon identifiant passe de 68 -> 92 et cela bloque mon code.

Comment réinitialiser la valeur IDENTITY?

16
Gijs

Vous pouvez réinitialiser la valeur d'identité en

DBCC CHECKIDENT('tableName', RESEED, 0)

La prochaine fois que vous insérerez dans TableName, la valeur d'identité insérée sera 1.

Lorsque vous supprimez des lignes du tableau, il ne réinitialisera pas la valeur d'identité, mais il continuera à l'augmenter. Tout comme ce qui s'est passé dans votre cas.

Maintenant, lorsque vous tronquez le tableau, il réinitialisera la valeur d'identité à sa valeur d'origine Seed du tableau).

Reportez-vous à: SQL SERVER - DELETE, TRUNCATE et RESEED Identity pour un exemple détaillé et une bonne explication de Différence entre Truncate et Delete

29
Kin Shah

Kin vous a montré comment réinitialiser la valeur IDENTITY, mais en dehors d'un environnement de développement lorsque vous supprimez vraiment tout des données, pourquoi avez-vous besoin de faire cela?

J'espère que vous n'avez pas l'intention de maintenir une séquence contiguë de valeurs IDENTITY lorsque vous êtes en production. Et j'espère que vous n'écrivez pas vraiment votre code pour coder en dur les valeurs IDENTITY. S'il s'agit de valeurs d'ID significatives, vous devez cesser d'utiliser la propriété IDENTITY.

Il y a quelques choses qui empêcheront cela de se produire:

  • si une valeur IDENTITY est affectée lors d'une transaction et que la transaction est annulée, la valeur n'est pas "rendue" et la valeur suivante sera celle qui n'a jamais été utilisée + 1.
  • si une ligne est supprimée ultérieurement, l'IDENTITÉ ne revient jamais pour combler les lacunes.
  • il y a un bogue actif dans SQL Server 2012 qui ne sera pas corrigé avant SQL Server 2014  ne sera jamais corrigé (sauf si vous utilisez un indicateur de trace non documenté et très coûteux), un redémarrage semblant ignorer jusqu'à 1000 valeurs de votre colonne IDENTITY. Le bogue sur Connect suggère que cela est limité aux événements de basculement impliquant des groupes de disponibilité, mais je peux vous assurer que le bogue est beaucoup plus large que cela.

En bref, si vous vous souciez des lacunes ou souhaitez donner un sens spécifique à ces valeurs, arrêtez d'utiliser IDENTITY. Supprimez et recréez la table et lorsque vous devez supprimer les valeurs et recharger, effectuez une mise à jour ou effectuez une insertion avec des valeurs codées en dur pour cette colonne.

En passant, la clé primaire et l'identité ne sont pas la même chose. Une colonne d'identité n'est pas une clé primaire sauf si vous la définissez explicitement comme telle, et vous pouvez certainement avoir une clé primaire qui n'est pas une colonne d'identité.

22
Aaron Bertrand