web-dev-qa-db-fra.com

Les valeurs de la colonne d'identité du serveur SQL commencent à 0 au lieu de 1

J'ai une situation étrange avec certaines tables de ma base de données commençant ses ID à partir de 0, même si TABLE CREATE a IDENTITY (1,1). C'est le cas pour certaines tables, mais pas pour d'autres. Cela a fonctionné jusqu'à aujourd'hui.

J'ai essayé de réinitialiser la colonne d'identité:

DBCC CHECKIDENT (SyncSession, reseed, 0);

Mais les nouveaux enregistrements commencent par 0. J'ai essayé de le faire pour toutes les tables, mais certains commencent toujours à partir de 0 et d'autres à partir de 1.

Des pointeurs?

(J'utilise SQL Server Express 2005 avec Advanced Services)

38
Muxa

De DBCC CHECKIDENT

DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )

Si aucune ligne n'a été insérée dans la table depuis sa création ou si toutes les lignes ont été supprimées à l'aide de l'instruction TRUNCATE TABLE, la première ligne insérée après avoir exécuté DBCC CHECKIDENT utilise new_reseed_value comme identité. Sinon, la ligne suivante insérée utilise new_reseed_value + la valeur d'incrément actuelle.

Donc, cela est prévu pour une table vide ou tronquée.

44
gbn

Si vous transmettez une valeur de réamorçage, la base de données démarre l'identité à partir de cette nouvelle valeur:

DBCC CHECKIDENT (SyncSession, RESEED, 0); --next record should be 0 + increment

Vous n'avez pas besoin de passer la valeur a, si vous ne le faites pas, IDENTITY(a,b) sera utilisé à la place:

DBCC CHECKIDENT (SyncSession, RESEED); --next record should be the seed value 'a'

Il s'agit généralement d'une meilleure pratique, car elle laisse la table plus proche de son état de création initial.

4
Keith

J'ai le même problème, la restauration à partir d'une sauvegarde après avoir modifié la base de données. Je viens d'ajouter un enregistrement fictif, puis de le supprimer ... puis de mettre RESEED à 0. Semble fonctionner.

2
Larry

C'est logique, puisque vous avez changé (réamorcé) la valeur d'identité à zéro?

DBCC CHECKIDENT (SyncSession, reseed, 1)

réamorcera votre colonne d'identité et s'assurera que le premier nouvel enregistrement commencera par 1.

2

Essaye ça

DECLARE @c TABLE (TanvtechId varchar(10),NewTanvtechId Varchar(10))
INSERT INTO @c
SELECT TanvtechId , Row_Number() OVER (ORDER BY TanvtechId ) from Tanvtech 

UPDATE G
SET G.TanvtechId =a.NewTanvtechId 
FROM Tanvtech as G INNER JOIN @c as a ON a.TanvtechId =G.TanvtechId 
1
Tanveer