web-dev-qa-db-fra.com

Valeur par défaut pour la colonne UUID dans Postgres

Dans Postgres 9.x, pour une colonne de type UUID , comment spécifier un UUID à générer automatiquement comme valeur par défaut pour toute insertion de ligne ?

76
Basil Bourque

tl; dr

Appelez DEFAULT lors de la définition d'une colonne pour appeler l'une des fonctions ussid OSSP . Le serveur Postgres invoquera automatiquement la fonction chaque fois qu'une ligne est insérée.

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

Si vous utilisez déjà l'extension pgcrypto , envisagez l'extension Answer by bpieck .

Plugin requis pour générer l'UUID

Alors que Postgres prêt à l'emploi prend en charge le stockage UUID (Universally Unique Identifier) valeurs sous leur forme native 128 bits , générant les valeurs UUID nécessitent un plug-in. Dans Postgres, un plug-in est appelé extension.

Pour installer une extension, appelez CREATE EXTENSION . Pour éviter la réinstallation, ajoutez IF NOT EXISTS. Voir mon article de blog pour plus de détails, ou voir cette page dans StackOverflow .

L'extension que nous voulons est une bibliothèque open-source construite en C pour travailler avec les UUID, uuid OSSP . Une construction de cette bibliothèque pour Postgres est souvent livrée avec une installation de Postgres comme les installateurs graphiques fournis by Enterprise DB = ou inclus par des fournisseurs de cloud tels que Amazon RDS pour PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Génération de différents types d'UUID

Voir le doc de l'extension pour voir une liste de plusieurs commandes proposées pour générer différents types de valeurs UUID. Pour obtenir la version originale de l'UUID construite à partir de l'ordinateur adresse MAC plus la date-heure actuelle plus une petite valeur aléatoire, appelez uuid_generate_v1() .

SELECT uuid_generate_v1();

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

Des variations ultérieures sur ce thème ont été développées pour d'autres types d'UUID. Certaines personnes peuvent ne pas vouloir enregistrer l'adresse MAC réelle du serveur, par exemple pour des raisons de sécurité ou de confidentialité. L'extension Postgres génère cinq types d'UUID, plus l'UUID "nil" 00000000-0000-0000-0000-000000000000.

UUID comme valeur par défaut

Cet appel de méthode peut être effectué automatiquement pour générer une valeur par défaut pour toute ligne nouvellement insérée. Lors de la définition de la colonne, spécifiez:

DEFAULT uuid_generate_v1()

Voir cette commande utilisée dans l'exemple de définition de table suivant.

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;

Versions UUID

Le plugin uuid-ossp peut générer différentes versions d'UUID .

  • uuid_generate_v1()
    Contient adresse MAC de l'ordinateur actuel + moment actuel. Couramment utilisé, mais à éviter si vous êtes sensible à la divulgation du MAC de votre serveur de base de données ou de l'heure à laquelle cette valeur a été générée. Défini par spécification comme un UUID version 1 .
  • uuid_generate_v1mc()
    Comme Version 1 , mais avec une adresse MAC de multidiffusion aléatoire au lieu de la véritable adresse MAC. Apparemment, un moyen d'utiliser la version 1, mais en substituant un autre MAC plutôt que le MAC réel de votre serveur de base de données si vous êtes sensible à la divulgation de ce fait.
    Qu'est-ce qu'un "MAC de multidiffusion aléatoire"? Je ne sais pas exactement . Après avoir lu la section 4.1.6 de RFC 4122 , je soupçonne que c'est un nombre aléatoire utilisé à la place du MAC mais avec des bits définis pour indiquer une adresse MAC de multidiffusion plutôt que la monodiffusion habituelle afin de distinguer cette variante de la version 1 d'un UUID réel de MAC version 1 habituel.
  • uuid_generate_v3( namespace uuid, name text )
    Contient un MD5hachage du texte que vous fournissez. Défini par la spécification comme un UUID Version 3 , namespace .
  • uuid_generate_v4()
    Basé sur des données générées aléatoirement pour 121-122 des 128 bits. Six ou sept bits utilisés pour indiquer la version et la variante. Ce type d'UUID n'est pratique que s'il est implémenté avec un générateur aléatoire cryptographiquement fort . Défini par spécification comme un UUID version 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Identique à la version 3 mais en utilisant SHA1 hachage. Défini par spécification comme UUID version 5 .
  • uuid_nil()
    Un cas spécial, tous les bits mis à zéro 00000000-0000-0000-0000-000000000000. Utilisé comme indicateur pour une valeur UUID inconnue. Connu sous le nom nil UUID .

Pour comparer les types, voir Question, Quelle version d'UUID utiliser?

Si vous êtes curieux de connaître les versions 3 et 5, consultez cette question, Génération de l'UUID v5. Qu'est-ce que le nom et l'espace de noms? .

Pour plus de discussion, voir ma réponse à une question similaire et mon article de blog Valeurs UUID de JDBC à Postgres .

106
Basil Bourque

Extension pgcrypto

Juste un petit ajout à la réponse très détaillée de Basil:

Étant donné que la plupart utilisent actuellement pgcrypto , au lieu de uuid_generate_v1(), vous pouvez utiliser gen_random_uuid() pour un Version 4 UUID valeur.

Tout d'abord, activez pgcrypto dans vos Postgres.

CREATE EXTENSION "pgcrypto";

Définissez simplement DEFAULT d'une colonne sur DEFAULT gen_random_uuid()

11
bpieck