335 votes

Réinitialiser l'auto incrémentation dans SQL Server après une suppression

J'ai supprimé quelques enregistrements d'une table dans une base de données SQL Server.

Les identifiants du tableau se présentent comme suit :

99 100 101 1200 1201...

Je souhaite supprimer les derniers enregistrements (ID >1200), puis réinitialiser l'incrémentation automatique afin que le prochain ID autogénéré soit 102. Mes enregistrements sont donc séquentiels. Existe-t-il un moyen de faire cela dans SQL Server ?

69 votes

S'il vous plaît, ne dites pas "Ne le faites pas". Je déteste quand je demande comment faire quelque chose et que tout ce que je reçois, c'est "ne le faites pas". Oui, la réinitialisation de l'identité peut causer des problèmes de clés étrangères, mais seulement si vous ne connaissez pas votre base de données et que vous ne programmez pas en conséquence. Il existe de très bonnes raisons de réinitialiser une identité après une suppression programmée - ce sont les auditeurs. Les auditeurs détestent voir des lacunes, alors remplissez-les, faites-le de manière contrôlée et assurez-vous que les contraintes des clés étrangères sont maintenues.

7 votes

@spyder, saviez-vous que vous aurez des lacunes si l'insertion d'un enregistrement est annulée, et pas seulement pour la suppression ? Vous ne pouvez pas éviter les lacunes avec un autoincrément et il est stupide d'essayer. J'ai travaillé pour une agence d'audit et les auditeurs compétents peuvent se faire expliquer cela. En outre, si vous disposez de tables d'audit appropriées, ils peuvent voir ce qu'il est advenu de ces enregistrements. Ou si, pour des raisons juridiques, il ne doit jamais y avoir de lacunes (il y a quelques cas de ce genre), alors seul un développeur incompétent utiliserait un autoincrément et les auditeurs seraient, à juste titre, contrariés.

565voto

Robert Wagner Points 7904

Exécutez la commande suivante pour réinitialiser mytable afin qu'il commence à 1 :

DBCC CHECKIDENT (mytable, RESEED, 0)

Pour en savoir plus, consultez le site Books on Line (BOL, aide SQL). Veillez également à ne pas avoir d'enregistrements plus élevés que la graine que vous définissez.

5 votes

... parce que les identifiants de ces enregistrements seront heureusement réutilisés, ce qui causera un grave désordre.

5 votes

En fait, pour que les ID commencent à 1, il faut utiliser 0 : DBCC CHECKIDENT (mytable, RESEED, 0)

10 votes

"DBCC CHECKIDENT ( nom_de_table )" définit la graine à l'identité la plus élevée de la table, ce qui vous évite de devoir "faire attention".

118voto

Fathah Rehman P Points 2509
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

Si le nombre = 0, le champ d'incrémentation automatique contiendra la valeur 1 lors de l'insertion suivante.

Si le nombre = 101, le champ d'incrémentation automatique contiendra la valeur 102 lors de l'insertion suivante.

Quelques informations supplémentaires... Peut être utile pour vous

Avant d'accorder une augmentation automatique number dans la requête ci-dessus, vous devez vous assurer que la colonne d'incrémentation automatique de votre table existante contient des valeurs inférieures à number .

Pour obtenir la valeur maximale d'une colonne (nom_colonne) d'une table (table1), vous pouvez utiliser la requête suivante

 SELECT MAX(column_name) FROM table1

0 votes

N'est-il pas possible de ne pas inclure le numéro de semence et d'utiliser le maximum ? Par exemple DBCC CHECKIDENT('databasename.dbo.tablename') et faire PAS inclure , RESEED, number ?

51voto

user423430 Points 1505

À peu près à l'abri des erreurs :

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete

1 votes

"DBCC CHECKIDENT ( nom_de_table )" fait la même chose (possible sans conditions de course).

2 votes

@user1027167 La documentation dit "si la valeur d'identité actuelle pour une table est inférieure à la valeur d'identité maximale stockée dans la colonne d'identité" ; cela ne couvre pas le nettoyage après la suppression des données (réutilisation des identifiants - souvent une mauvaise idée). Vérifié sur SQL 2008

1 votes

La meilleure réponse systématique et automatique. Bravo !

7voto

BMG Points 73

Supprimer et réaffecter toutes les tables d'une base de données.

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.

1voto

HLGEM Points 54641

Ce n'est pas souhaitable en général. La réinitialisation peut créer des problèmes d'intégrité des données. Elle ne doit être utilisée que sur des systèmes de développement où l'on efface toutes les données de test et où l'on repart à zéro. Elle ne doit pas être utilisée sur un système de production au cas où tous les enregistrements liés n'auraient pas été supprimés (toutes les tables qui devraient être dans une relation de clé étrangère ne le sont pas forcément !) Vous risquez de créer un véritable désordre en procédant de la sorte, surtout si vous voulez le faire régulièrement après chaque suppression. C'est une mauvaise idée de s'inquiéter des lacunes dans les valeurs des champs d'identité.

6 votes

Je ne l'utiliserai pas tout le temps et ce n'était que sur une base de données de test.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X