Valore predefinito per la colonna UUID in Postgres


Risposte:


94

tl; dr

Chiamare DEFAULTquando si definisce una colonna per richiamare una delle funzioni uuid OSSP . Il server Postgres invocherà automaticamente la funzione ogni volta che viene inserita una riga.

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

Se si utilizza già l' estensione pgcrypto , considerare la risposta per bpieck .

Plugin richiesto per generare UUID

Mentre Postgres supporta immediatamente la memorizzazione dei valori UUID (Universally Unique Identifier) nella loro forma nativa a 128 bit , la generazione di valori UUID richiede un plug-in. In Postgres, un plug-in è noto come extension.

Per installare un interno, chiama CREATE EXTENSION. Per evitare la reinstallazione, aggiungere IF NOT EXISTS. Vedi il mio post sul blog per maggiori dettagli o vedi questa pagina in StackOverflow .

L'estensione che vogliamo è una libreria open source costruita in C per lavorare con UUID, uuid OSSP . Una build di questa libreria per Postgres è spesso associata a un'installazione di Postgres come i programmi di installazione grafici forniti da Enterprise DB o inclusi da provider cloud come Amazon RDS per PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Generazione di vari tipi di UUID

Consulta il documento dell'estensione per visualizzare un elenco di più comandi offerti per generare vari tipi di valori UUID. Per ottenere la versione originale di UUID creata dall'indirizzo MAC del computer più la data e l'ora corrente più un piccolo valore casuale, chiama uuid_generate_v1().

SELECT uuid_generate_v1();

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

Le variazioni successive su questo tema sono state sviluppate per tipi alternativi di UUID. Alcune persone potrebbero non voler registrare l'indirizzo MAC effettivo del server, ad esempio per motivi di sicurezza o privacy. L'estensione Postgres genera cinque tipi di UUID, oltre all'UUID "zero" 00000000-0000-0000-0000-000000000000.

UUID come valore predefinito

Tale chiamata al metodo può essere effettuata automaticamente per generare un valore predefinito per qualsiasi riga appena inserita. Quando si definisce la colonna, specificare:

DEFAULT uuid_generate_v1()

Vedi quel comando usato nella seguente definizione della tabella di esempio.

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;

Versioni UUID

Il plugin uuid-ossp può generare varie versioni di UUID .

  • uuid_generate_v1()
    Contiene l' indirizzo MAC del computer corrente + momento corrente. Comunemente utilizzato, ma evitare se si è sensibili alla divulgazione del MAC del server del database o al momento in cui questo valore è stato generato. Definito dalle specifiche come UUID versione 1 .
  • uuid_generate_v1mc()
    Come la versione 1 , ma con un indirizzo MAC multicast casuale invece del vero indirizzo MAC. Apparentemente un modo per utilizzare la versione 1 ma sostituendo un altro MAC anziché il MAC effettivo del server di database se si è sensibili alla divulgazione di tale fatto.
    Che cos'è un "MAC multicast casuale"? Non lo so esattamente . Dopo aver letto la sezione 4.1.6 di RFC 4122 , sospetto che questo sia un numero casuale usato al posto del MAC ma con bit impostati per indicare un indirizzo MAC multicast anziché il solito unicast in modo da distinguere questa variazione della versione 1 da una normale UUID real-MAC versione 1.
  • uuid_generate_v3( namespace uuid, name text )
    Contiene un hash MD5 di testo fornito. Definito dalla specifica come UUID versione 3 , UUID basato sullo spazio dei nomi .
  • uuid_generate_v4()
    Basato su dati generati casualmente per 121-122 dei 128 bit. Sei o sette bit utilizzati per indicare la versione e la variante. Questo tipo di UUID è pratico solo se implementato con un generatore casuale crittograficamente forte . Definito dalle specifiche come UUID versione 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Come per la versione 3 ma usando l' hash SHA1 . Definito dalle specifiche come UUID versione 5 .
  • uuid_nil()
    Un caso speciale, tutti i bit impostati su zero 00000000-0000-0000-0000-000000000000. Utilizzato come flag per un valore UUID sconosciuto. Conosciuto come UUID nullo .

Per confrontare i tipi, vedi Domanda, Quale versione UUID usare?

Se sei curioso di conoscere le versioni 3 e 5, vedi questa domanda, Generazione dell'UUID v5. Che cos'è il nome e lo spazio dei nomi? .

Per ulteriori discussioni, vedere la mia risposta a una domanda simile e il mio post sul blog Valori UUID da JDBC a Postgres .


1.000.000 di hit su Google per come creare colonne di tipo UUID. Zero successi su come impazzire le righe di query da quel pk !! : - @
Clint Eastwood,

@ClintEastwood La mia risposta a una domanda simile e il mio post sul blog I valori UUID da JDBC a Postgres potrebbero aiutarti in questo. Se quelli si dimostrano insufficienti, pubblica una nuova domanda. Sarei felice di fare un altro tentativo. Capisco la tua frustrazione!
Basil Bourque,

@ClintEastwood: la sintassi per confrontare una colonna UUID con un valore segue la sintassi per le costanti documentata nel manuale: postgresql.org/docs/current/static/… e type cast: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: non è davvero necessario eseguire il cast del risultato getObject()che puoi usare ancheUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit Per verificare la forza del generatore di numeri casuali, guarda l'implementazione open source sottostante che è racchiusa da questa estensione Postgres, il progetto di libreria uuid OSSP come menzionato nella mia risposta. E ricorda, gli UUID versione 4 dovrebbero essere usati solo come ultima risorsa, se per qualche motivo non puoi scegliere gli altri tipi. Generalmente, la prima scelta dovrebbe essere il tipo Versione 1, chiamando uuid_generate_v1o uuid_generate_v1mc.
Basil Bourque,

8

estensione pgcrypto

Solo una piccola aggiunta alla risposta molto dettagliata di Basil:

Dato che attualmente la maggior parte utilizza pgcrypto , invece di uuid_generate_v1()te puoi usare gen_random_uuid()un valore UUID versione 4 .

Innanzitutto, abilita pgcrypto in Postgres.

CREATE EXTENSION "pgcrypto";

Basta impostare DEFAULT di una colonna su DEFAULT gen_random_uuid()

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.