Valeur par défaut de la colonne UUID dans Postgres


Réponses:


94

tl; dr

Appelez DEFAULTlors de la définition d'une colonne pour appeler l'une des fonctions uss OSSP . Le serveur Postgres appelle 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 , considérez la réponse par bpieck .

Plugin requis pour générer l'UUID

Alors que Postgres out-of-the-box prend en charge le stockage des valeurs UUID (identificateur unique universel) sous leur forme native à 128 bits , la génération de valeurs UUID nécessite un plug-in. Dans Postgres, un plug-in est appelé un extension.

Pour installer une extension, appelez CREATE EXTENSION. Pour éviter de réinstaller, 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 des UUID, OSSP uuid . Une compilation de cette bibliothèque pour Postgres est souvent associée à une installation de Postgres telle que les programmes d’ installation graphique fournis par Enterprise DB ou incluse par les 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 la documentation 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 d'origine de l'UUID construite à partir de l'adresse MAC de l'ordinateur, de la date et de l'heure actuelles et d'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 nouvelle ligne insérée. Lors de la définition de la colonne, spécifiez:

DEFAULT uuid_generate_v1()

Voir la 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 l'adresse MAC de l'ordinateur actuel + l'instant actuel. Couramment utilisé, mais évitez si vous êtes sensible à la divulgation de l'adresse MAC de votre serveur de base de données ou à l'heure à laquelle cette valeur a été générée. Défini par la spécification en tant qu'UUID de version 1 .
  • uuid_generate_v1mc()
    Comme la version 1 , mais avec une adresse MAC multicast 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 de votre serveur de base de données si vous souhaitez divulguer ce fait.
    Qu'est-ce qu'un «MAC multicast aléatoire»? Je ne sais pas exactement . Après avoir lu la section 4.1.6 de la RFC 4122 , je soupçonne qu’il s’agit d’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 variation de la Version 1 d’une modification habituelle. real-MAC UUID version 1.
  • uuid_generate_v3( namespace uuid, name text )
    Contient un hachage MD5 de texte fourni. Définie par la spécification comme UUID version 3 , espace de noms à base UUID.
  • 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 la spécification en tant qu'UUID version 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Identique à la version 3 mais en utilisant le hachage SHA1 . Défini par la spécification en tant que UUID version 5 .
  • uuid_nil()
    Un cas particulier, tous les bits mis à zéro 00000000-0000-0000-0000-000000000000. Utilisé comme indicateur pour une valeur UUID inconnue. Connu comme un UUID nul .

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

Si vous êtes intéressé par les versions 3 et 5, consultez cette question, Génération de l’UUID v5. Quel est le nom et l'espace de noms? .

Pour plus de discussion, voir ma réponse à une question similaire et les valeurs UUID de mon blog publiées de JDBC à Postgres .


1 000 000 visites dans Google pour savoir comment créer des colonnes de type UUID. Zero hits pour savoir comment faire paniquer les lignes de requête par ce pk !! : - @
Clint Eastwood Le

@ClintEastwood Ma réponse à une question similaire et mon article de blog Les valeurs UUID de JDBC à Postgres pourraient vous aider. Si ceux-ci s'avèrent insuffisants, posez une nouvelle question. Je serais heureux de tenter un autre coup. Je comprends ta frustration!
Basil Bourque

@ClintEastwood: la syntaxe permettant de comparer une colonne UUID avec une valeur suit la syntaxe des constantes décrite dans le manuel: postgresql.org/docs/current/static/… et les conversions de type: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: Il n'est pas vraiment nécessaire de convertir le résultat. getObject()Vous pouvez également utiliserUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit Pour vérifier la force du générateur de nombres aléatoires, regardez l'implémentation open-source sous-jacente enveloppée par cette extension Postgres, le projet de bibliothèque uss OSSP , comme mentionné dans ma réponse. Et rappelez-vous, les UUID de la version 4 ne doivent être utilisés qu'en dernier recours, si pour une raison quelconque vous ne pouvez pas choisir les autres types. En règle générale, votre premier choix devrait être le type de la version 1, en appelant l’un uuid_generate_v1ou l’ autre uuid_generate_v1mc.
Basil Bourque

8

extension pgcrypto

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

Comme actuellement, la plupart utilisent pgcrypto , uuid_generate_v1()vous pouvez utiliser gen_random_uuid()une valeur UUID version 4 à la place .

Premièrement, activez pgcrypto dans votre Postgres.

CREATE EXTENSION "pgcrypto";

Il suffit de définir DEFAULT d’une colonne sur DEFAULT gen_random_uuid()

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.