sql >> Databasteknik >  >> RDS >> Sqlserver

Använd NEWSEQUENTIALID() för att skapa en inkrementerande GUID i SQL Server

I SQL Server kan du använda NEWSEQUENTIALID() funktion för att skapa inkrementella unika värden.

Den skapar en GUID (Globally Unique IDentifier) ​​som är större än någon GUID som tidigare genererats av den här funktionen på en specificerad dator sedan operativsystemet startades. Efter att ha startat om operativsystemet kan GUID:n starta om från ett lägre intervall, men är fortfarande globalt unikt.

NEWSEQUENTIALID() funktionen kan endast användas med DEFAULT begränsningar på tabellkolumner av typen uniqueidentifier . Därför kan du inte bara köra en fråga som SELECT NEWSEQUENTIALID() och förvänta dig att det fungerar (men du kan). gör det med NEWID() funktion).

Exempel 1 – Som ett DEFAULT-värde

Här är ett snabbt exempel för att visa hur det fungerar:

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

Observera att GUID:erna genererades som en del av DEFAULT begränsning på bordet. De angavs inte uttryckligen i INSERT uttalande.

Exempel 2 – Anges uttryckligen i INSERT-utlåtandet

Här är vad som händer om du försöker använda NEWSEQUENTIALID() i din INSERT uttalande:

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 måste vara en del av en DEFAULT begränsning (som i föregående exempel).

För att infoga ovanstående data behöver vi bara ta bort den första kolumnen från 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          |
+--------------------------------------+-----------------+

Exempel 3 – Används i en SELECT-sats

Du kommer att få samma felmeddelande om du försöker använda den här funktionen i en grundläggande SELECT uttalande så här:

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.

Säkerhet/sekretess

Det rekommenderas att inte använda NEWSEQUENTIALID() för känslig data, eftersom det är möjligt att gissa värdet på nästa genererade GUID och därför få tillgång till data som är kopplade till det GUID.


  1. MySQL root-lösenordsändring

  2. JSON_SET() – Infoga eller uppdatera värden i ett JSON-dokument i MySQL

  3. TO_TIMESTAMP() Funktion i Oracle

  4. Använda INSERT med en PostgreSQL-databas med Python