Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използвайте NEWSEQUENTIALID(), за да създадете нарастващ GUID в SQL Server

В 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да върнете всички деактивирани ограничения CHECK в SQL Server (пример за T-SQL)

  2. Производителност на SQL сървър TOP IO заявка -1

  3. Как да вмъкна байт[] в колона VARBINARY на SQL сървър

  4. Как да махна таблица, ако съществува?

  5. SQL Server CASE Expression