2009-04-07 12 views
31

Ich habe eine seltsame Situation mit einigen Tabellen in meiner Datenbank, die ihre IDs von 0 beginnen, obwohl TABLE CREATE IDENTITY (1,1) hat. Dies gilt für einige Tabellen, aber nicht für andere. Es hat bis heute funktioniert.SQL Server-Identitätsspaltenwerte beginnen bei 0 statt 1

Ich habe versucht, das Zurücksetzen Identitätsspalte:

DBCC CHECKIDENT (SyncSession, reseed, 0); 

Aber neue Aufzeichnungen beginnen mit 0. Ich habe versucht, diese Tabellen für alle zu tun, aber einige beginnen noch 0 und einige von 1.

Irgendwelche Zeiger?

(i bin mit SQL Server Express 2005 mit Advanced Services)

+0

Es stimmt etwas nicht mit Ihrem Design, wenn Sie ständig den Wert neu erstellen. Und warum sollte es eine Rolle spielen, ob es mit 0 oder 1 beginnt?Es ist ein Autoinkrement, es sollte egal sein, was der Wert ist, nur dass es einzigartig ist und automatisch zugewiesen wird. – HLGEM

+2

Fünf Jahre zu spät zur Party, aber - wie ich - könnte das OP gerade mit einem bekannten Datensatz entwickelt und getestet haben. Nicht unbedingt etwas stimmt nicht mit dem Design. – GeoffM

+0

@HLGEM - hier ist, warum es maters. Wenn Sie ein Code-Objekt aus einem Datenbank-Datensatz auffüllen, wird das Objekt mit einer "ID" -Eigenschaft von 0 initialisiert. Wenn das Auffüllen erfolgreich ist, wird es etwas anderes als der Standardwert von 0 sein. 0 kann dann keinen gefundenen Datensatz anzeigen oder ein "neues" Objekt. – nuander

Antwort

41

Von DBCC CHECKIDENT

DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 

starten Wenn keine Zeilen haben die eingefügt worden Tabelle, seit es erstellt wurde, oder alle Zeilen wurden mit der TRUNCATE TABLE-Anweisung entfernt, die erste Zeile eingefügt nach dem Ausführen von DBCC CHECKIDENT verwendet new_seed_value als die Identität. Andernfalls verwendet die nächste Zeile eingefügt new_seed_value + aktuellen Inkrementwert.

So wird dies für eine leere oder abgeschnittene Tabelle erwartet.

+0

Nur FYI, die DELETE FROM-Anweisung verwendet das letztere Verhalten, "die nächste eingefügte Zeile verwendet new_seed_value + den aktuellen Inkrementwert". –

+0

DELETE wird keine Seeds zurücksetzen .. ist das was du meinst? – gbn

+0

@GBN, das ist richtig, aber was ich gemeint habe, ist mit DBCC CHECKIDENT (SyncSession, reseed, new_seed_value); Um einen Seed für eine Tabelle nach einem DELETE zurückzusetzen, wird der new_seed_value genommen und der aktuelle Inkrementwert für die erste Zeile hinzugefügt. –

2

Dies ist logisch, da man (reseeded) die Identität Wert auf Null geändert hat?

DBCC CHECKIDENT (SyncSession, reseed, 1) 

Ihre Identitätsspalte, reseed und stellen Sie sicher, dass der erste neue Datensatz mit 1.

+1

Nein, das stimmt nicht. Der erste Wert, der verwendet wird, wenn Sie 1 auf diese Weise angeben, ist 2! –

+0

Ah, es sei denn, Sie tun dies auf einer leeren Tabelle, in diesem Fall nimmt es den Wert, den Sie angeben. Entschuldigung !!! –

+0

Ich habe dies auf leere Tabellen versucht und jetzt beginnen einige Tabellen von 1 und einige von 2. – Muxa

2

Ich habe das gleiche Problem, die Wiederherstellung von einem Backup nach der Änderung der DB. Ich füge einfach einen Dummy-Datensatz hinzu und lösche ihn dann ... und setze RESEED auf 0. Scheint zu funktionieren.

1

Versuchen Sie, diese

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 
3

Wenn Sie einen reseed Wert der DB übergeben wird, die Identität von diesem neuen Wert starten:

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

Sie müssen allerdings den Wert nicht passieren, wenn

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

Dies ist in der Regel eine bessere Praxis, wie es die ta Blätter: Sie müssen nicht IDENTITY(a,b) wird stattdessen verwendet näher zu seinem ursprünglichen geschaffenen Zustand.

-1
DBCC CHECKIDENT (Table_Name, RESEED, 0) 

Dies ist ein Weg, um ein id mit Zero(0) zu starten, dann löschen Sie alle Zeilen aus der Tabelle und die Daten wieder zurück in den Tisch legen.