Próbuję wygenerować unikalne numery zamówień zakupu, które zaczynają się od 1 i zwiększają o 1. Mam tabelę PONumber utworzoną za pomocą tego skryptu:
CREATE TABLE [dbo].[PONumbers]
(
[PONumberPK] [int] IDENTITY(1,1) NOT NULL,
[NewPONo] [bit] NOT NULL,
[DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)
);
I procedura składowana utworzona za pomocą tego skryptu:
CREATE PROCEDURE [dbo].[GetPONumber]
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
SELECT SCOPE_IDENTITY() AS PONumber;
END
W momencie tworzenia działa to dobrze. Po uruchomieniu procedura przechowywana rozpoczyna się od żądanej liczby i zwiększa się o 1.
Dziwne jest to, że jeśli wyłączę lub przejdę w stan hibernacji komputera, to przy następnym uruchomieniu procedury sekwencja zwiększy się o prawie 1000.
Zobacz wyniki poniżej:
Widać, że liczba wzrosła z 8 do 1002!
- Dlaczego to się dzieje?
- Jak mogę się upewnić, że liczby nie są pomijane w ten sposób?
- Potrzebuję tylko, aby SQL wygenerował liczby, które są:
- a) Gwarantowany niepowtarzalny.
- b) przyrost o żądaną kwotę.
Przyznaję, że nie jestem ekspertem od SQL. Czy źle rozumiem, co robi SCOPE_IDENTITY ()? Czy powinienem stosować inne podejście? Sprawdziłem sekwencje w SQL 2012+, ale Microsoft twierdzi, że domyślnie nie ma gwarancji, że będą unikalne.
źródło
To jest problem SQL Servera. Wszystko, co możesz zrobić, to ponownie ustawić kolumnę.
usuń wpisy z niewłaściwym identyfikatorem kolumny. Ponownie sprawdź tożsamość kolumny. A następnie następny wpis ma odpowiedni identyfikator.
Reseed Identity przy użyciu następującego polecenia sql:
DBCC CHECKIDENT ('YOUR_TABLE_NAME', RESEED, 9)
- 9 to ostatni poprawny identyfikatorźródło