sql >> Databáze >  >> RDS >> Sqlserver

Pomocí NEWSEQUENTIALID() vytvořte na serveru SQL Server zvyšující se identifikátor GUID

V SQL Server můžete použít NEWSEQUENTIALID() funkce k vytvoření přírůstkových jedinečných hodnot.

Vytvoří GUID (globálně jedinečný identifikátor), který je větší než kterýkoli GUID dříve vygenerovaný touto funkcí na určeném počítači od spuštění operačního systému. Po restartování operačního systému může GUID začít znovu z nižšího rozsahu, ale stále je celosvětově jedinečné.

NEWSEQUENTIALID() funkci lze použít pouze s DEFAULT omezení na sloupce tabulky typu uniqueidentifier . Proto nemůžete pouze spustit dotaz jako SELECT NEWSEQUENTIALID() a očekávat, že to bude fungovat (ale můžete udělejte to pomocí NEWID() funkce).

Příklad 1 – Jako VÝCHOZÍ hodnota

Zde je rychlý příklad demonstrující, jak to funguje:

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;

Výsledek:

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

Všimněte si, že GUID byly vygenerovány jako součást DEFAULT omezení na stole. Nebyly výslovně uvedeny v INSERT prohlášení.

Příklad 2 – Explicitně uveden v příkazu INSERT

Zde je to, co se stane, když se pokusíte použít NEWSEQUENTIALID() ve vašem INSERT prohlášení:

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

Výsledek:

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.

Musí tedy být součástí DEFAULT omezení (jako v předchozím příkladu).

K vložení výše uvedených dat stačí odstranit první sloupec z INSERT operace:

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

SELECT * FROM Prisoner;

Výsledek:

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

Příklad 3 – Používá se v příkazu SELECT

Pokud se pokusíte použít tuto funkci v základním SELECT, dostanete stejnou chybu prohlášení jako toto:

SELECT NEWSEQUENTIALID();

Výsledek:

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.

Zabezpečení/Soukromí

Nedoporučuje se používat NEWSEQUENTIALID() pro citlivá data, protože je možné odhadnout hodnotu dalšího vygenerovaného GUID, a tudíž získat přístup k datům spojeným s tímto GUID.


  1. Správa vysoké dostupnosti v PostgreSQL – Část III:Patroni

  2. Jak mohu zkombinovat více řádků do seznamu odděleného čárkami v SQL Server 2005?

  3. Jak objednávat podle data v SQLite

  4. Jaké je minimální nastavení potřebné k nasazení aplikace .NET s klientem Oracle 11?