W SQL Server możesz użyć NEWID()
funkcja, aby stworzyć unikalną wartość.
Mówiąc dokładniej, jest to funkcja zgodna z RFC4122, która tworzy unikalną wartość typu uniqueidentifier .
Wartość, którą NEWID()
produce to losowo generowany 16-bajtowy identyfikator GUID (Globally Unique IDentifier). Jest to również znane jako UUID (Universally Unique IDentifier).
Przykład 1 – Podstawowa instrukcja SELECT
Oto szybki SELECT
instrukcja zwracająca NEWID()
:
SELECT NEWID() AS Result;
Wynik:
+--------------------------------------+ | Result | |--------------------------------------| | ab1b299b-9781-48d9-bedc-f238f6f5cc57 | +--------------------------------------+
RFC4122 zawiera 5 wersji (lub podtypów). Mogę powiedzieć, że ten przykład używa RFC4122 w wersji 4, ze względu na 4 w odpowiednim miejscu. Wersja 4 określa, że identyfikator GUID jest generowany losowo lub pseudolosowo. Inne wersje wykorzystują inne metody generowania identyfikatora GUID.
Gdy spojrzysz na wszystkie przykłady na tej stronie, zauważysz, że wszystkie są niepowtarzalne, ale wszystkie mają postać: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx , co oznacza, że wszystkie są identyfikatorami GUID w wersji 4, a zatem wszystkie są generowane losowo lub pseudolosowo.
Przykład 2 – Używanie NEWID() ze zmienną
Oto przykład umieszczenia wartości NEWID()
do zmiennej, a następnie wybierając ją.
DECLARE @myguid uniqueidentifier = NEWID(); SELECT @myguid AS Result;
Wynik:
+--------------------------------------+ | Result | |--------------------------------------| | b6cfb25a-3f81-4e5a-a304-a4b44fb5dbeb | +--------------------------------------+
Przykład 3 – Konwersja na ciąg
Oto przykład konwersji wartości zmiennej na ciąg, a następnie jej wydrukowania.
DECLARE @myguid uniqueidentifier = NEWID(); PRINT 'Value: '+ CONVERT(varchar(255), @myguid);
Wynik:
Value: 9A229A64-6FE0-417E-B07D-78444EA7DA5B
Przykład 4 – jako wartość domyślna w bazie danych
Oto przykład użycia NEWID()
jako wartość domyślną w kolumnie bazy danych.
USE Test; CREATE TABLE Customer ( CustomerId uniqueidentifier NOT NULL DEFAULT NEWID(), CustomerName varchar(70) NOT NULL, ); INSERT Customer (CustomerName) VALUES ('Peter Griffin'), ('Marge Simpson'), ('Borat Schwarzenegger'); SELECT * FROM Customer;
Wynik:
+--------------------------------------+----------------------+ | CustomerId | CustomerName | |--------------------------------------+----------------------| | 6f7f606f-9ed3-48f3-b70e-90d901591203 | Peter Griffin | | 79b470df-a317-4359-92af-35cd6394eb5d | Marge Simpson | | ed59b667-4cd4-4849-b697-ec2410d7b7ff | Borat Schwarzenegger | +--------------------------------------+----------------------+
W tym przykładzie tworzę tabelę zawierającą unikalny identyfikator kolumna z domyślną wartością wygenerowaną przez NEWID()
. Następnie wstawiam dane do tej tabeli. Kiedy to robię, nie określam CustomerId
wartość, więc używa wartości domyślnej (która jest generowana przez NEWID()
). Na koniec wybieram zawartość tabeli, która pokazuje użycie identyfikatora GUID, który został wygenerowany przy każdym wstawieniu wiersza.
Przykład 5 – wyraźnie określony w oświadczeniu INSERT
Możesz także jawnie użyć NEWID()
podczas wstawiania danych.
Tak:
INSERT Customer (CustomerId, CustomerName) VALUES (NEWID(), 'Bart Farnsworth'), (NEWID(), 'Bruce Norris'); SELECT * FROM Customer;
Wynik:
+--------------------------------------+----------------------+ | CustomerId | CustomerName | |--------------------------------------+----------------------| | 6f7f606f-9ed3-48f3-b70e-90d901591203 | Peter Griffin | | 79b470df-a317-4359-92af-35cd6394eb5d | Marge Simpson | | ed59b667-4cd4-4849-b697-ec2410d7b7ff | Borat Schwarzenegger | | a21e9a65-5efd-43ea-bd8b-8040b379617a | Bart Farnsworth | | 5ae0e501-3944-4be0-bf8a-ba964d8d13ed | Bruce Norris | +--------------------------------------+----------------------+
Tutaj używam NEWID()
aby wygenerować unikalny identyfikator dla każdego wiersza, dlatego wartość domyślna nie jest używana. Tak czy inaczej, oba są generowane przez NEWID()
dzięki czemu skutecznie uzyskujemy ten sam wynik – losowo wygenerowany identyfikator GUID.