sql >> Database teknologi >  >> RDS >> Sqlserver

Brug NEWSEQUENTIALID() til at oprette en inkrementerende GUID i SQL Server

I SQL Server kan du bruge NEWSEQUENTIALID() funktion til at skabe trinvise unikke værdier.

Den opretter en GUID (Globally Unique IDentifier), der er større end nogen GUID, der tidligere er genereret af denne funktion på en specificeret computer, siden operativsystemet blev startet. Efter genstart af operativsystemet kan GUID'et starte igen fra et lavere område, men det er stadig globalt unikt.

NEWSEQUENTIALID() funktionen kan kun bruges med DEFAULT begrænsninger på tabelkolonner af typen uniqueidentifier . Derfor kan du ikke bare køre en forespørgsel som SELECT NEWSEQUENTIALID() og forventer, at det virker (men du kan). gør det med NEWID() funktion).

Eksempel 1 – Som STANDARDværdi

Her er et hurtigt eksempel for at demonstrere, hvordan det virker:

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;

Resultat:

+--------------------------------------+-----------------+
| PrisonerId                           | PrisonerName    |
|--------------------------------------+-----------------|
| a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld  |
| aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza |
| b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes    |
+--------------------------------------+-----------------+

Bemærk, at GUID'erne blev genereret som en del af DEFAULT begrænsning på bordet. De var ikke eksplicit angivet i INSERT erklæring.

Eksempel 2 – Eksplicit angivet i INSERT-erklæringen

Her er, hvad der sker, hvis du prøver at bruge NEWSEQUENTIALID() i din INSERT erklæring:

INSERT Prisoner (PrisonerId, PrisonerName)
VALUES (NEWSEQUENTIALID(), 'Kramer');

Resultat:

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.

Så det skal være en del af en DEFAULT begrænsning (som i det foregående eksempel).

For at indsætte ovenstående data skal vi bare fjerne den første kolonne fra INSERT operation:

INSERT Prisoner (PrisonerName)
VALUES ('Kramer');

SELECT * FROM Prisoner;

Resultat:

+--------------------------------------+-----------------+
| 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          |
+--------------------------------------+-----------------+

Eksempel 3 – Brugt i en SELECT-erklæring

Du får den samme fejl, hvis du prøver at bruge denne funktion i en grundlæggende SELECT udsagn som denne:

SELECT NEWSEQUENTIALID();

Resultat:

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.

Sikkerhed/fortrolighed

Det anbefales ikke at bruge NEWSEQUENTIALID() for følsomme data, fordi det er muligt at gætte værdien af ​​det næste genererede GUID og derfor få adgang til data, der er knyttet til det GUID.


  1. MySQL kopidatabase

  2. Kunne ikke finde den lagrede procedure 'dbo.aspnet_CheckSchemaVersion'

  3. Gendan tabelstruktur fra frm- og ibd-filer

  4. Hvordan Atand() virker i PostgreSQL