Réinitialiser la valeur IDENTITY


16

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?


Je rendrais mon code plus résistant aux valeurs d'identité manquantes. Une colonne d'identité ne garantit pas la numérotation contiguë et finira par arriver
Trubs

Réponses:


29

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.

Désormais, lorsque vous tronquez la table, elle réinitialisera la valeur d'identité à sa valeur d'origine de la table.

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


22

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

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 prochaine valeur 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é tant que SQL Server 2014 ne sera jamais corrigé (sauf si vous utilisez un indicateur de trace non documenté et très coûteux) par lequel un redémarrage semblera rejeter 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.

Soit dit 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é.


-4

Si vous avez seulement besoin d'éliminer les dernières lignes qui n'ont pas suivi la valeur incrémentielle d'un champ d'identité, il existe un moyen simple et sûr:

  1. supprimez d'abord les derniers enregistrements qui ont «sauté»
  2. changer le type de données de votre champ d'identité (de int à bigint ou vice versa)
  3. sauver la table
  4. ajouter un nouvel enregistrement et vérifier qu'il attribue le numéro de la valeur la plus élevée + 1
  5. Remplacez le type de données de votre champ d'identité, selon vos besoins

et vous avez terminé.


3
"Enregistrer la table" n'est pas une instruction significative pour SQL Server. La modification des types de données peut être triviale avec moins de 100 lignes mais peut s'avérer très coûteuse pour les grandes tables.
Michael Green

2
Je suppose que vous voulez dire dans SSMS. Cela créera un nouveau tableau, copiera toutes les lignes dedans, supprimera l'ancien tableau et renommera le nouveau. Et vous devez le faire deux fois pour basculer le type de données en arrière. Il utilise un marteau pour casser une noix.
Martin Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.