Wartość domyślna dla kolumny UUID w Postgres


Odpowiedzi:


92

tl; dr

Wywołaj DEFAULTpodczas definiowania kolumny, aby wywołać jedną z funkcji uuid OSSP . Serwer Postgres będzie automatycznie wywoływał funkcję przy każdym wstawieniu wiersza.

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

Wtyczka wymagana do wygenerowania UUID

Chociaż Postgres po wyjęciu z pudełka obsługuje przechowywanie wartości UUID (Universally Unique Identifier) w natywnej 128-bitowej formie, generowanie wartości UUID wymaga wtyczki. W Postgres wtyczka jest znana jako extension.

Aby zainstalować rozszerzenie, zadzwoń CREATE EXTENSION. Aby uniknąć ponownej instalacji, dodaj IF NOT EXISTS. Zobacz mój post na blogu, aby uzyskać więcej informacji lub zobacz tę stronę w StackOverflow .

Rozszerzenie, którego chcemy, to biblioteka typu open source wbudowana w C do pracy z UUID, OSU uuid . Build tej biblioteki dla PostgreSQL jest często powiązane z instalacji PostgreSQL takie jak graficznych instalatorów dostarczonych przez Enterprise DB lub zawartych przez dostawców cloud, takich jak Amazon RDS dla PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Generowanie różnych rodzajów UUID

Zobacz dokument rozszerzenia, aby zobaczyć listę wielu poleceń oferowanych do generowania różnego rodzaju wartości UUID. Aby uzyskać oryginalną wersję UUID zbudowaną z adresu MAC komputera oraz bieżącej daty i godziny oraz małej wartości losowej, zadzwoń uuid_generate_v1().

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

Późniejsze wersje tego tematu zostały opracowane dla alternatywnych rodzajów UUID. Niektóre osoby mogą nie chcieć rejestrować rzeczywistego adresu MAC serwera, na przykład ze względów bezpieczeństwa lub prywatności. Rozszerzenie Postgres generuje pięć rodzajów UUID oraz UUID „zero” 00000000-0000-0000-0000-000000000000.

UUID jako wartość domyślna

To wywołanie metody może być wykonane automatycznie w celu wygenerowania wartości domyślnej dla każdego nowo wstawionego wiersza. Podczas definiowania kolumny określ:

DEFAULT uuid_generate_v1()

Zobacz to polecenie użyte w poniższej przykładowej definicji tabeli.

CREATE TABLE public.pet_
(
  species_ text NOT NULL,
  name_ text NOT NULL,
  date_of_birth_ text NOT NULL,
  uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
  CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pet_
  OWNER TO postgres;

Wersje UUID

UUID-ossp Wtyczka może generować różne wersje UUID .

  • uuid_generate_v1()
    Zawiera adres MAC bieżącego komputera + aktualny moment. Powszechnie używane, ale unikaj, jeśli jesteś wrażliwy na ujawnienie adresu MAC serwera bazy danych lub czasu wygenerowania tej wartości. Zdefiniowane przez specyfikację jako UUID wersji 1 .
  • uuid_generate_v1mc()
    Podobnie jak wersja 1 , ale z losowym adresem MAC multiemisji zamiast prawdziwego adresu MAC. Najwyraźniej sposób na użycie wersji 1, ale zastąpienie innego MAC zamiast faktycznego MAC serwera bazy danych, jeśli jesteś wrażliwy na ujawnienie tego faktu.
    Co to jest „losowy MAC multiemisji”? Nie wiem dokładnie . Po przeczytaniu sekcji 4.1.6 RFC 4122 podejrzewam, że jest to liczba losowa używana zamiast adresu MAC, ale z bitami ustawionymi w celu wskazania adresu MAC multiemisji zamiast zwykłej emisji pojedynczej, aby odróżnić tę odmianę wersji 1 od zwykłej UUID real-MAC Version 1.
  • uuid_generate_v3( namespace uuid, name text )
    Zawiera skrót MD5 podanego tekstu. Określone w specyfikacji w wersji 3 UUID , nazw -na UUID.
  • uuid_generate_v4()
    Na podstawie losowo wygenerowanych danych dla 121-122 ze 128 bitów. Sześć lub siedem bitów używanych do oznaczenia wersji i wariantu. Ten rodzaj UUID jest praktyczny tylko wtedy, gdy jest implementowany z silnym kryptograficznie losowym generatorem . Zdefiniowany przez specyfikację jako UUID wersji 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Taki sam jak wersja 3, ale z użyciem skrótu SHA1 . Zdefiniowany przez specyfikację jako UUID w wersji 5 .
  • uuid_nil()
    Specjalny przypadek, wszystkie bity ustawione na zero 00000000-0000-0000-0000-000000000000. Używany jako flaga dla nieznanej wartości UUID. Znany jako zero UUID .

Aby porównać typy, zobacz Pytanie, której wersji UUID użyć?

Jeśli jesteś ciekawy wersji 3 i 5, zobacz to pytanie, Generowanie UUID v5. Co to jest nazwa i przestrzeń nazw? .

Aby uzyskać więcej dyskusji, zobacz moją odpowiedź na podobne pytanie i mój blog wpisuje wartości UUID od JDBC do Postgres .


1 000 000 trafień w Google za tworzenie kolumn typu UUID. Zero trafień za dziwne wiersze zapytań przez ten pk !! : - @
Clint Eastwood

@ClintEastwood Moja odpowiedź na podobne pytanie i mój blog może zawierać wartości UUID od JDBC do Postgres . Jeśli okażą się niewystarczające, opublikuj nowe pytanie. Byłbym szczęśliwy, mogąc zrobić to jeszcze raz. Rozumiem twoją frustrację!
Basil Bourque,

@ClintEastwood: składnia służąca do porównania kolumny UUID z wartością jest zgodna ze składnią dla stałych udokumentowaną w podręczniku: postgresql.org/docs/current/static/... i typ casting: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: Przekazanie wyniku nie jest tak naprawdę konieczne - getObject()możesz użyćUUID id = rs.getObject("uuid_", UUID.class);
a_horse_w_na_nazną

1
@Rokit Aby zweryfikować siłę generatora liczb losowych, spójrz na podstawową implementację typu open source, która jest zapakowana w to rozszerzenie Postgres, projekt biblioteki UUID OSSP, jak wspomniano w mojej odpowiedzi. I pamiętaj, UUID w wersji 4 powinny być używane tylko w ostateczności, jeśli z jakiegoś powodu nie możesz wybrać innych typów. Generalnie Twój pierwszy wybór powinien być rodzaj Wersja 1, dzwoniąc albo uuid_generate_v1albo uuid_generate_v1mc.
Basil Bourque,

7

rozszerzenie pgcrypto

Mały dodatek do bardzo szczegółowej odpowiedzi Bazylego:

Ponieważ obecnie większość używa pgcrypto , zamiast uuid_generate_v1()ciebie możesz użyć wartości UUIDgen_random_uuid() w wersji 4 .

Najpierw włącz pgcrypto w swoim Postgresie.

CREATE EXTENSION "pgcrypto";

Wystarczy ustawić DOMYŚLNE kolumny na DEFAULT gen_random_uuid()

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.