J'ai inséré des enregistrements dans une table de base de données SQL Server. La table avait une clé primaire définie et la valeur de départ de l'incrémentation automatique est définie sur «Oui». Cela est principalement dû au fait que dans SQL Azure, chaque table doit avoir une clé primaire et une identité définies.
Mais comme je dois supprimer certains enregistrements de la table, la graine d'identité de ces tables sera perturbée et la colonne d'index (qui est générée automatiquement avec un incrément de 1) sera perturbée.
Comment puis-je réinitialiser la colonne d'identité après avoir supprimé les enregistrements afin que la colonne ait une séquence dans l'ordre numérique croissant?
La colonne d'identité n'est utilisée comme clé étrangère nulle part dans la base de données.
Réponses:
La
DBCC CHECKIDENT
commande de gestion est utilisée pour réinitialiser le compteur d'identité. La syntaxe de la commande est:Exemple:
Il n'était pas pris en charge dans les versions précédentes d'Azure SQL Database, mais il est désormais pris en charge.
Veuillez noter que l'
new_reseed_value
argument varie selon les versions de SQL Server selon la documentation :Cependant, je trouve ces informations trompeuses (tout simplement fausses en fait) car le comportement observé indique qu'au moins SQL Server 2012 utilise toujours new_reseed_value + la logique de valeur d'incrément actuelle. Microsoft contredit même son propre
Example C
contenu sur la même page:Pourtant, tout cela laisse une option pour un comportement différent sur les nouvelles versions de SQL Server. Je suppose que la seule façon d'être sûr, jusqu'à ce que Microsoft clarifie les choses dans sa propre documentation, est de faire des tests réels avant utilisation.
la source
DBCC CHECKIDENT
soit pris en charge à partir de la prochaine version (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Bien que, pour cette situation particulière, je recommanderais toujours TRUNCATE TABLE :)Où 0 est la
identity
valeur de départla source
TRUNCATE
, alors la nouvelle valeur de départ devrait être la valeur pour la prochaine utilisation (c'est-à-dire 1 et non 0). Si la table n'est pas vide, elle utilisera lenew_reseed_value + 1
. MSDNDELETE
, nonTRUNCATE
, auquel cas elle l'est égalementnew_reseed+value + 1
. J'ai écrit un article à ce sujet, montrant le comportement réel via certains tests, et mis à jour le document réel (maintenant que nous pouvons le faire car il est sur GitHub): Comment fonctionne vraiment DBCC CHECKIDENT lors de la réinitialisation de la graine d'identité (RESEED)? .Il convient de noter que SI toutes les données sont supprimées de la table via la clause
DELETE
(c'est-à-dire aucuneWHERE
clause), tant que a) les autorisations le permettent, et b) il n'y a pas de FK référençant la table (qui semble être le cas ici), l'utilisationTRUNCATE TABLE
serait préférable car elle est plus efficaceDELETE
et réinitialise laIDENTITY
graine en même temps. Les détails suivants sont extraits de la page MSDN de TRUNCATE TABLE :Donc, ce qui suit:
Devient juste:
Veuillez consulter la
TRUNCATE TABLE
documentation (liée ci-dessus) pour plus d'informations sur les restrictions, etc.la source
Bien que la plupart des réponses suggèrent RESEED à 0, mais plusieurs fois, nous devons simplement réamorcer le prochain ID disponible
Cela vérifiera le tableau et réinitialisera l'ID suivant.
la source
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
J'ai essayé de
@anil shahs
répondre et cela a réinitialisé l'identité. Mais quand une nouvelle ligne a été insérée, elle a obtenu leidentity = 2
. Au lieu de cela, j'ai changé la syntaxe:Ensuite, la première ligne obtiendra l'identité = 1.
la source
Bien que la plupart des réponses suggèrent
RESEED
à0
, et alors que certains voient cela comme un défaut pour lesTRUNCATED
tables, Microsoft a une solution qui exclut laID
Cela vérifiera le tableau et reviendra au suivant
ID
. Ceci est disponible depuis MS SQL 2005 jusqu'à la version actuelle.https://msdn.microsoft.com/en-us/library/ms176057.aspx
la source
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
mais lors de nouvelles insertions, il utilise toujours la graine incorrecte.l'émission de la commande 2 peut faire l'affaire
la première réinitialise l'identité à zéro et la suivante la remet à la prochaine valeur disponible - jacob
la source
@Jacob
A fonctionné pour moi, je devais simplement effacer toutes les entrées du tableau, puis ajouter ce qui précède dans un point de déclenchement après la suppression. Maintenant, chaque fois que je supprime une entrée est prise de là.
la source
Truncate
La table est préférée car elle efface les enregistrements, réinitialise le compteur et récupère l'espace disque.Delete
etCheckIdent
doit être utilisé uniquement lorsque les clés étrangères vous empêchent de tronquer.la source
Réinitialiser la colonne d'identité avec un nouvel identifiant ...
la source
C'est une question courante et la réponse est toujours la même: ne le faites pas. Les valeurs d'identité doivent être traitées comme arbitraires et, en tant que telles, il n'y a pas d'ordre "correct".
la source
Exécutez ce script pour réinitialiser la colonne d'identité. Vous devrez apporter deux modifications. Remplacez tableXYZ par la table que vous devez mettre à jour. En outre, le nom de la colonne d'identité doit être supprimé de la table temporaire. C'était instantané sur une table de 35 000 lignes et 3 colonnes. Évidemment, sauvegardez la table et essayez d'abord cela dans un environnement de test.
la source
Cela mettra la valeur d'identité actuelle à 0.
Lors de l'insertion de la valeur suivante, la valeur d'identité est incrémentée à 1.
la source
Utilisez cette procédure stockée:
Je reviens simplement sur ma réponse. Je suis tombé sur un comportement étrange dans SQL Server 2008 R2 que vous devez connaître.
La première sélection produit
0, Item 1
.Le second produit
1, Item 1
. Si vous exécutez la réinitialisation juste après la création de la table, la valeur suivante est 0. Honnêtement, je ne suis pas surpris que Microsoft ne puisse pas corriger ce problème. Je l'ai découvert parce que j'ai un fichier script qui remplit les tables de référence que j'exécute parfois après avoir recréé les tables et parfois lorsque les tables sont déjà créées.la source
J'utilise le script suivant pour ce faire. Il n'y a qu'un seul scénario dans lequel cela produira une "erreur", c'est-à-dire si vous avez supprimé toutes les lignes de la table et qu'il
IDENT_CURRENT
est actuellement défini sur 1, c'est-à-dire qu'il n'y avait qu'une seule ligne dans la table pour commencer.la source
Pour une suppression complète des lignes et réinitialiser le nombre IDENTITY, j'utilise ceci (SQL Server 2008 R2)
la source
Réinstaller à 0 n'est pas très pratique, sauf si vous nettoyez la table dans son ensemble.
sinon, la réponse donnée par Anthony Raymond est parfaite. Obtenez d'abord le maximum de la colonne d'identité, puis ajoutez-le à max.
la source
J'ai essayé de faire cela pour un grand nombre de tables pendant le développement, et cela fonctionne comme un charme.
Ainsi, vous le forcez d'abord à être défini sur 1, puis vous le définissez sur l'index le plus élevé des lignes présentes dans le tableau. Reste rapide et facile de l'idex.
la source
Il est toujours préférable d'utiliser TRUNCATE lorsque cela est possible au lieu de supprimer tous les enregistrements car il n'utilise pas également l'espace de journal.
Dans le cas où nous avons besoin de supprimer et de réinitialiser la graine, rappelez-vous toujours que si la table n'a jamais été remplie et que vous l'avez utilisée,
DBCC CHECKIDENT('tablenem',RESEED,0)
le premier enregistrement obtiendra une identité = 0 comme indiqué dans la documentation msdnla source
TRUNCATE
cela empêcheraitROLLBACK
de se comporter comme prévu? ROLLBACK annule toujours. Même si la base de données est définie surBULK_LOGGED
.Première: Spécification d'identité Juste: "Non" >> Enregistrer le projet d'exécution de la base de données
Après cela: Spécification d'identité Juste: "OUI" >> Enregistrer le projet d'exécution de la base de données
Votre ID de base de données, PK À partir de 1 >>
la source