В SQL Server можете да използвате NEWSEQUENTIALID()
функция за създаване на постепенни уникални стойности.
Той създава GUID (глобално уникален идентификатор), който е по-голям от всеки GUID, генериран преди това от тази функция на посочен компютър от стартирането на операционната система. След рестартиране на операционната система, GUID може да започне отново от по-нисък диапазон, но все още е глобално уникален.
NEWSEQUENTIALID()
функцията може да се използва само с DEFAULT
ограничения за колоните на таблицата от тип uniqueidentifier . Следователно не можете просто да изпълните заявка като SELECT NEWSEQUENTIALID()
и очаквайте да работи (но вие можете направете това с NEWID()
функция).
Пример 1 – като стойност по подразбиране
Ето един бърз пример, за да демонстрирате как работи:
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;
Резултат:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Имайте предвид, че GUID са генерирани като част от DEFAULT
ограничение на масата. Те не бяха изрично предоставени в INSERT
изявление.
Пример 2 – Изрично предоставено в изявлението INSERT
Ето какво се случва, ако се опитате да използвате NEWSEQUENTIALID()
във вашия INSERT
изявление:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Резултат:
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.
Така че трябва да е част от DEFAULT
ограничение (както в предишния пример).
За да вмъкнем горните данни, всичко, което трябва да направим, е да премахнем първата колона от INSERT
операция:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Резултат:
+--------------------------------------+-----------------+ | 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 | +--------------------------------------+-----------------+
Пример 3 – Използва се в оператор SELECT
Ще получите същата грешка, ако се опитате да използвате тази функция в основен SELECT
изявление като това:
SELECT NEWSEQUENTIALID();
Резултат:
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.
Сигурност/Поверителност
Препоръчително е да не използвате NEWSEQUENTIALID()
за чувствителни данни, тъй като е възможно да се отгатне стойността на следващия генериран GUID и следователно да получите достъп до данни, свързани с този GUID.