W SQL Server możesz użyć NEWSEQUENTIALID()
funkcja do tworzenia przyrostowych unikalnych wartości.
Tworzy identyfikator GUID (Globally Unique IDentifier), który jest większy niż jakikolwiek identyfikator GUID wygenerowany wcześniej przez tę funkcję na określonym komputerze od momentu uruchomienia systemu operacyjnego. Po ponownym uruchomieniu systemu operacyjnego identyfikator GUID może rozpocząć się ponownie z niższego zakresu, ale nadal jest globalnie unikalny.
NEWSEQUENTIALID()
funkcja może być używana tylko z DEFAULT
ograniczenia dotyczące kolumn tabeli typu unikalny identyfikator . Dlatego nie możesz po prostu uruchomić zapytania takiego jak SELECT NEWSEQUENTIALID()
i spodziewaj się, że zadziała (ale możesz zrób to za pomocą NEWID()
funkcja).
Przykład 1 – jako wartość domyślna
Oto krótki przykład pokazujący, jak to działa:
USE Test; CREATE TABLE Prisoner ( PrisonerId uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(), PrisonerName varchar(70) NOT NULL, ); INSERT Prisoner (PrisonerName) VALUES ('Jerry Seinfeld'), ('George Costanza'), ('Elaine Benes'); SELECT * FROM Prisoner;
Wynik:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Zauważ, że identyfikatory GUID zostały wygenerowane jako część DEFAULT
ograniczenie na stole. Nie zostały wyraźnie podane w INSERT
oświadczenie.
Przykład 2 – wyraźnie podany w instrukcji INSERT
Oto, co się stanie, jeśli spróbujesz użyć NEWSEQUENTIALID()
w swoim INSERT
oświadczenie:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Wynik:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Musi więc być częścią DEFAULT
ograniczenie (jak w poprzednim przykładzie).
Aby wstawić powyższe dane, wystarczy usunąć pierwszą kolumnę z INSERT
operacja:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Wynik:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | | b76d433e-f36b-1410-8a80-007d2b533547 | Kramer | +--------------------------------------+-----------------+
Przykład 3 – używany w instrukcji SELECT
Otrzymasz ten sam błąd, jeśli spróbujesz użyć tej funkcji w podstawowym SELECT
oświadczenie takie jak to:
SELECT NEWSEQUENTIALID();
Wynik:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Bezpieczeństwo/Prywatność
Zaleca się, aby nie używać NEWSEQUENTIALID()
w przypadku danych wrażliwych, ponieważ można odgadnąć wartość następnego wygenerowanego identyfikatora GUID, a tym samym uzyskać dostęp do danych powiązanych z tym identyfikatorem GUID.