web-dev-qa-db-fra.com

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

J'ai supprimé des enregistrements d'une table dans une base de données SQL Server. Les ID vont maintenant de 101 à 1200. Je souhaite supprimer les enregistrements à nouveau, mais je veux que l'ID revienne à 102. Y a-t-il un moyen de le faire dans SQL Server?

242
jumbojs

Emettez la commande suivante pour réamorcer mytable pour qu'elle commence à 1:

DBCC CHECKIDENT (mytable, RESEED, 0)

Lisez à ce sujet dans la documentation en ligne (aide BOL, SQL). Veillez également à ne pas avoir d’enregistrements supérieurs à la valeur de départ que vous définissez.

417
Robert Wagner
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

si nombre = 0 alors dans l'insertion suivante le champ d'incrémentation automatique contiendra la valeur 1

si nombre = 101, dans la prochaine insertion, le champ d'incrémentation automatique contiendra la valeur 102


Quelques informations supplémentaires ... peuvent vous être utiles

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

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

 SELECT MAX(column_name) FROM table1
79
Fathah Rehman P

semi-imbécile:

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

34
user423430

Essaye ça:

ALTER TABLE tablename AUTO_INCREMENT = 1
9
xaa

Supprimer et réensemencer 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.
6
BMG

Je l'ai compris. Ses:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
6
jumbojs

Sur la base de la réponse acceptée, pour ceux qui ont rencontré un problème similaire, avec qualification complète du schéma:

([MyDataBase].[MySchemaName].[MyTable]) ... entraîne une erreur, vous devez être dans le contexte de cette base de données

C'est-à-dire que les erreurs suivantes vont générer une erreur:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

Placez à la place le nom complet de la table avec des guillemets simples:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
4
user919426

Plusieurs réponses recommandent d'utiliser une déclaration comme ceci:

DBCC CHECKIDENT (mytable, RESEED, 0)

Mais l'OP a déclaré "supprimer certains enregistrements", qui peuvent ne pas être tous, de sorte qu'une valeur de 0 n'est pas toujours la bonne. Une autre réponse a suggéré de rechercher automatiquement la valeur actuelle maximale et de réensemencer à celle-ci, mais cela pose problème si la table ne contient aucun enregistrement. Max () renvoie donc NULL. Un commentaire suggéré d'utiliser simplement

DBCC CHECKIDENT (mytable)

pour réinitialiser la valeur, mais un autre commentaire a correctement indiqué que cela n'augmente que la valeur au maximum déjà dans la table; cela ne réduira pas la valeur si elle est déjà supérieure au maximum de la table, ce que le PO voulait faire.

Une meilleure solution combine ces idées. Le premier CHECKIDENT réinitialise la valeur à 0 et le second à la valeur la plus élevée actuellement dans la table, au cas où il y aurait des enregistrements dans la table:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

Comme plusieurs commentaires l'ont indiqué, assurez-vous qu'il n'y a pas de clé étrangère dans les autres tables pointant sur les enregistrements supprimés. Sinon, ces clés étrangères pointeront sur les enregistrements que vous créez après avoir réensemencé la table, ce qui n’est certainement pas ce que vous aviez à l’esprit.

3
Michael Rodby

Vous ne voulez pas faire cela en général. Reseed peut créer des problèmes d'intégrité des données. C’est vraiment uniquement pour une utilisation sur des systèmes de développement où vous effacez toutes les données de test et recommencez. Il ne doit pas être utilisé sur un système de production si tous les enregistrements associés n'ont pas été supprimés (toutes les tables devant contenir une relation de clé étrangère ne le sont pas!). Vous pouvez créer un désordre en procédant ainsi, surtout si vous souhaitez le faire régulièrement après chaque suppression. C'est une mauvaise idée de vous inquiéter des lacunes dans les valeurs de votre champ d'identité.

2
HLGEM

Je veux ajouter cette réponse car l'approche DBCC CHECKIDENT- génèrera des problèmes lorsque vous utiliserez des schémas pour les tables. Utilisez ceci pour être sûr:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

Si vous voulez vérifier le succès de l'opération, utilisez

SELECT IDENT_CURRENT(@Table);

qui devrait sortir 0 dans l'exemple ci-dessus.

2
Alexander Schmidt

Et ça?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

Il s'agit d'un moyen simple et rapide de modifier l'incrément automatique à 0 ou à un nombre quelconque de votre choix. J'ai compris cela en exportant une base de données et en lisant le code moi-même.

Vous pouvez également l'écrire comme ceci pour en faire une solution monoligne:

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
0
Victor Resnov