2009-04-07 6 views
31

Mam dziwną sytuację z niektórymi tabelami w bazie danych, zaczynającymi od 0, mimo że TABLE CREATE ma TOŻSAMOŚĆ (1,1). Jest tak w przypadku niektórych tabel, ale nie dla innych. Działa do dziś.Wartości kolumny tożsamości serwera SQL zaczynają się od 0 zamiast 1

Próbowałem resetowanie kolumna tożsamości:

DBCC CHECKIDENT (SyncSession, reseed, 0); 

Ale nowe rekordy zacząć 0. Próbowałem to zrobić dla wszystkich tabel, ale niektórzy wciąż zaczynać od 0, a niektóre z 1.

Jakieś wskazówki?

(używam SQL Server Express 2005 z Advanced Services)

+0

Coś jest nie tak z twoim projektem, jeśli ciągle wysłuchujesz wartości. I dlaczego ma to znaczenie, jeśli zaczyna się od 0 lub 1?To autoinkrecja, nie powinno mieć znaczenia, jaka jest wartość, tylko że jest unikalna i automatycznie przypisana. – HLGEM

+2

Pięć lat spóźnionych na imprezę, ale - jak ja - PO mógł właśnie opracowywać i testować ze znanym zbiorem danych. Niekoniecznie coś nie tak z projektem. – GeoffM

+0

@HLGEM - oto dlaczego tak się dzieje. jeśli zapełniasz obiekt kodu z rekordu bazy danych, obiekt zainicjuje właściwość "ID" równą 0. Następnie, jeśli zapełnianie się powiedzie, będzie to coś innego niż domyślne 0. 0 może wtedy wskazywać brak znalezionego rekordu lub "nowy" obiekt. – nuander

Odpowiedz

41

Od DBCC CHECKIDENT

DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 

Jeśli nie wiersze zostały włożone do tabela od momentu jej utworzenia lub wszystkie wiersze zostały usunięte przy użyciu instrukcji TRUNCATE TABLE o numerze , pierwszej wiersz wstawiony po uruchomieniu DBCC CHECKIDENT używa wartości new_reseed_value jako tożsamości. W przeciwnym razie wstawiony następny wiersz używa wartości new_reseed_value + aktualnej wartości przyrostu.

Jest to oczekiwane w przypadku pustego lub obciętego stołu.

+0

Po prostu FYI, instrukcja DELETE FROM będzie używać tego ostatniego zachowania, "wstawiony następny wiersz używa wartości new_reseed + aktualna wartość przyrostu". –

+0

DELETE nie zresetuje nasion .. czy to masz na myśli? – gbn

+0

@GBN, to prawda, ale to, co miałem na myśli, to używanie DBCC CHECKIDENT (SyncSession, reseed, new_reseed_value); zresetowanie materiału siewnego dla tabeli po wykonaniu DELETE spowoduje przyjęcie wartości new_reseed_value i dodanie jej aktualnej wartości przyrostu dla pierwszego wiersza. –

2

Jest to logiczne, ponieważ zmieniłeś (reseeded) wartość tożsamość do zera?

DBCC CHECKIDENT (SyncSession, reseed, 1) 

będzie reseedować swoją kolumnę tożsamości i upewnij się, że pierwszy nowy rekord rozpocznie 1.

+1

Nie, to nie w porządku. Pierwszą wartością użytą, jeśli podasz 1 w ten sposób, będzie 2! –

+0

Ah, chyba że robisz to na pustej tabeli, w takim przypadku przyjmuje ona określoną wartość. Przeprosiny!!! –

+0

Próbowałem tego na pustych tabelach i teraz niektóre tabele zaczynają się od 1, a niektóre od 2. – Muxa

2

Mam ten sam problem, przywracając z kopii zapasowej po zmodyfikowaniu DB. Dodaję tylko fałszywy rekord, a następnie go skasuję ... następnie ustaw RESEED na 0. Wydaje się działać.

1

Spróbuj

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

Jeśli przekazać wartość RESEED DB rozpocznie tożsamości z tej nowej wartości:

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

Nie możecie przekazać wartość chociaż, jeśli Państwo nie IDENTITY(a,b) będzie używany zamiast:

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

Ta praktyka jest zazwyczaj lepiej, ponieważ pozostawia TA bliżej początkowego stanu utworzonego.

-1
DBCC CHECKIDENT (Table_Name, RESEED, 0) 

Jest to sposób, aby rozpocząć id z Zero(0), a następnie usunąć wszystkie wiersze z tabeli i ponownie umieścić dane z powrotem do stołu.

Powiązane problemy