Comment réinitialiser automatiquement après avoir utilisé identity insert?

j'ai récemment migré d'une base de données PostgreSQL vers une base de données SQL Server. Pour basculer les données, J'ai dû activer IDENTITY_INSERT. Bien venir pour découvrir que je reçois toutes sortes d'erreurs étranges dues à des valeurs d'identité dupliquées(qui sont définies comme des clés primaires) en faisant une insertion dans l'une des tables.

j'ai pas mal de tables. Quelle serait la façon la plus facile de réensemencer automatiquement l'identité de chaque table pour qu'elle soit après max(RID) ?

15
demandé sur Earlz 2010-05-27 22:35:42

4 réponses

utilisez les informations dans ce lien en combinaison avec une fonction SQL qui obtient le max(RID) de chaque table que vous devez réinitialiser. Par exemple, si vous voulez démarrer votre clé primaire à 25000, utilisez le code ci - dessous (StartSeedValue-1)

DBCC CHECKIDENT('myTable', RESEED, 24999)

donc en combinaison, vous devriez finir avec quelque chose comme ça

DECLARE @maxVal INT
SELECT @maxVal = ISNULL(max(ID),0)+1 from mytable
DBCC CHECKIDENT('mytable', RESEED, @maxVal)

désolé pour le Pseudo-code, ça fait longtemps que j'ai écrit un SQL fonction:)

EDIT:

Merci pour la capture, changé le nombre entier à INT

USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO 

ceci vous donnera une liste de toutes les tables d'utilisateurs dans la base de données. Utilisez cette requête comme "loop" et qui devrait permettre de réinitialiser les graines sur toutes les tables.

24
répondu Tommy 2017-05-23 12:34:28

la réponse de Tommy est correcte, mais si je lis documentation bon ceci peut être simplifié à juste:

DBCC CHECKIDENT ('myTable')

selon la documentation:

si la valeur actuelle d'identité pour une table est inférieure au maximum valeur d'identité stockée dans la colonne d'identité, elle est réinitialisée en utilisant le valeur maximale dans la colonne identité.

cela vous sauve de la besoin de rechercher l'ID maximum manuellement, et est pris en charge à partir de SQL Server 2005.

cela devrait fonctionner dans le cas OP original. La Documentation mentionne cependant deux cas où cela ne fonctionnera pas, et vous devez vous rabattre sur la solution de Tommy avec la recherche de la valeur maximale D'ID manuellement:

  • la valeur actuelle d'identité est plus grande que la valeur maximale dans le table.
  • toutes les lignes sont supprimées du tableau.
12
répondu Sebastian K 2015-11-01 22:20:06

peut-être que la façon la plus simple (aussi fou que cela puisse paraître et aussi code-puant que cela puisse paraître) est d'exécuter DBCC CHECKIDENT deux fois comme ceci:

-- sets all the seeds to 1
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)'

-- run it again to get MSSQL to figure out the MAX/NEXT seed automatically
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

fait.

si vous voulez, vous pouvez l'exécuter une fois de plus pour voir à quoi toutes les graines ont été placées:

-- run it again to display what the seeds are now set to
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

C'est juste une façon créative de profiter du commentaire de la documentation:

si la valeur d'identité courante pour un tableau est inférieur au maximum valeur d'identité stockée dans la colonne d'identité, elle est réinitialisée en utilisant le valeur maximale dans la colonne identité.

1
répondu 010110110101 2016-11-03 04:54:02

Restauration de cas -

j'ai testé dans ma base de données et ne fonctionne que si j'utilise ce code indiqué précédemment (avec une modification sur le +1 - nous n'avons pas besoin de cela).

DECLARE @maxVal INT
SELECT @maxVal = ISNULL(max(codsequencia),0) from teste_sequencial
DBCC CHECKIDENT(teste_sequencial, RESEED, @maxVal)

Note, si u met le +1 après la partie' ISNULL', la colonne identité suivante sautera +1 , par exemple - colonne actuelle 10, après le code la suivante sera 11 , si u utilise +1 après isnull, sera +12.

et, les codes:

DBCC CHECKIDENT (teste_sequencial)

Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'')'

ne marchait pas du tout pour moi dans les affaires de rétrogradation. Si u ouvre une transaction , et fait le retour en arrière , la redirection commencera au dernier numéro utilisé dans la transaction.

0
répondu Josmar Marques Silva 2016-11-29 17:33:28