Standardwert für die UUID-Spalte in Postgres


Antworten:


92

tl; dr

Aufruf DEFAULTbeim Definieren einer Spalte zum Aufrufen einer der OSSP-UUID- Funktionen. Der Postgres-Server ruft die Funktion bei jedem Einfügen einer Zeile automatisch auf.

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

Zum Generieren der UUID ist ein Plugin erforderlich

Während Postgres die sofortige Speicherung von UUID- Werten (Universally Unique Identifier) in ihrer nativen 128-Bit- Form unterstützt, ist für die Generierung von UUID-Werten ein Plug-In erforderlich. In Postgres wird ein Plug-In als extension.

Um eine Erweiterung zu installieren, rufen Sie an CREATE EXTENSION. Um eine Neuinstallation zu vermeiden, fügen Sie hinzu IF NOT EXISTS. Weitere Informationen finden Sie in meinem Blogbeitrag oder auf dieser Seite in StackOverflow .

Die gewünschte Erweiterung ist eine Open-Source-Bibliothek, die in C für die Arbeit mit UUIDs ( OSSP uuid) erstellt wurde . Ein Build dieser Bibliothek für Postgres wird häufig mit einer Installation von Postgres gebündelt, z. B. den von Enterprise DB bereitgestellten grafischen Installationsprogrammen oder von Cloud-Anbietern wie Amazon RDS für PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Generieren verschiedener Arten von UUID

Im Dokument der Erweiterung finden Sie eine Liste mit mehreren Befehlen zum Generieren verschiedener Arten von UUID-Werten. Rufen Sie an, um die Originalversion der UUID zu erhalten, die aus der MAC-Adresse des Computers, der aktuellen Datums- und Uhrzeitangabe sowie einem kleinen Zufallswert erstellt wurde uuid_generate_v1().

SELECT uuid_generate_v1();

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

Spätere Variationen dieses Themas wurden für alternative Arten von UUIDs entwickelt. Einige Benutzer möchten möglicherweise nicht die tatsächliche MAC-Adresse des Servers aufzeichnen, z. B. aus Sicherheits- oder Datenschutzgründen. Die Postgres-Erweiterung generiert fünf Arten von UUIDs sowie die "Null" -UUID 00000000-0000-0000-0000-000000000000.

UUID als Standardwert

Dieser Methodenaufruf kann automatisch ausgeführt werden, um einen Standardwert für eine neu eingefügte Zeile zu generieren. Geben Sie beim Definieren der Spalte Folgendes an:

DEFAULT uuid_generate_v1()

Siehe den Befehl in der folgenden Beispieltabellendefinition.

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;

UUID-Versionen

Das Plugin uuid-ossp kann verschiedene Versionen von UUID generieren .

  • uuid_generate_v1()
    Enthält die MAC-Adresse des aktuellen Computers und den aktuellen Moment. Wird häufig verwendet. Vermeiden Sie jedoch, dass Sie die MAC-Adresse Ihres Datenbankservers oder den Zeitpunkt, zu dem dieser Wert generiert wurde, offenlegen. Durch Spezifikation als UUID der Version 1 definiert .
  • uuid_generate_v1mc()
    Wie Version 1 , jedoch mit einer zufälligen Multicast-MAC-Adresse anstelle der tatsächlichen MAC-Adresse. Anscheinend eine Möglichkeit, Version 1 zu verwenden, aber einen anderen MAC anstelle des tatsächlichen MAC Ihres Datenbankservers zu ersetzen, wenn Sie sensibel sind, diese Tatsache preiszugeben.
    Was ist ein zufälliger Multicast-MAC? Ich weiß es nicht genau . Nach dem Lesen von Abschnitt 4.1.6 von RFC 4122 vermute ich, dass dies eine Zufallszahl ist, die anstelle des MAC verwendet wird, wobei jedoch Bits gesetzt sind, um eine Multicast-MAC-Adresse anstelle des üblichen Unicasts anzugeben, um diese Variante von Version 1 von einer üblichen zu unterscheiden Real-MAC Version 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    Enthält einen von Ihnen bereitgestellten MD5- Hash . Definiert durch die Spezifikation als Version 3 UUID , Namespace - basierte UUID.
  • uuid_generate_v4()
    Basierend auf zufällig generierten Daten für 121-122 der 128 Bits. Sechs oder sieben Bits zur Angabe von Version und Variante. Diese Art von UUID ist nur dann praktisch, wenn sie mit einem kryptografisch starken Zufallsgenerator implementiert wird . Durch Spezifikation als UUID der Version 4 definiert .
  • uuid_generate_v5( namespace uuid, name text )
    Wie Version 3, jedoch mit SHA1- Hashing. Durch Spezifikation als Version 5-UUID definiert .
  • uuid_nil()
    In einem Sonderfall werden alle Bits auf Null gesetzt 00000000-0000-0000-0000-000000000000. Wird als Flag für einen unbekannten UUID-Wert verwendet. Bekannt als Null-UUID .

Informationen zum Vergleichen von Typen finden Sie unter Frage, welche UUID-Version verwendet werden soll.

Wenn Sie sich für die Versionen 3 und 5 interessieren, lesen Sie diese Frage, Generieren der v5-UUID. Was ist Name und Namespace? .

Weitere Informationen finden Sie in der Antwort auf eine ähnliche Frage und in den UUID-Werten meines Blogposts von JDBC zu Postgres .


1.000.000 Treffer in Google zum Erstellen von Spalten vom Typ UUID. Zero Hits für das Ausflippen von Abfragezeilen mit diesem Paket !! : - @
Clint Eastwood

@ClintEastwood Meine Antwort auf eine ähnliche Frage und die UUID-Werte meines Blogposts von JDBC bis Postgres könnten Ihnen dabei helfen. Wenn diese nicht ausreichen, posten Sie eine neue Frage. Ich würde es gerne noch einmal versuchen. Ich verstehe deine Frustration!
Basil Bourque

@ClintEastwood: Die Syntax zum Vergleichen einer UUID-Spalte mit einem Wert folgt der Syntax für die im Handbuch dokumentierten Konstanten: postgresql.org/docs/current/static/… und Typumwandlungen: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: Es ist nicht wirklich notwendig, das Ergebnis zu wirken, das getObject()du auch verwenden UUID id = rs.getObject("uuid_", UUID.class);
kannst

1
@Rokit Um die Stärke des Zufallszahlengenerators zu überprüfen, schauen Sie sich die zugrunde liegende Open-Source-Implementierung an, die von dieser Postgres-Erweiterung, dem OSSP-UUID- Bibliotheksprojekt, wie in meiner Antwort erwähnt , umschlossen wird. Denken Sie daran, dass UUIDs der Version 4 nur als letzter Ausweg verwendet werden sollten, wenn Sie aus irgendeinem Grund die anderen Typen nicht auswählen können. Im Allgemeinen sollte Ihre erste Wahl die Art von Version 1 sein, indem Sie entweder uuid_generate_v1oder aufrufen uuid_generate_v1mc.
Basil Bourque

7

pgcrypto- Erweiterung

Nur eine kleine Ergänzung zu Basils sehr detaillierter Antwort:

Da zur Zeit die meisten verwenden pgcrypto , statt uuid_generate_v1()Sie verwenden können , gen_random_uuid()für eine Version 4 UUID Wert.

Aktivieren Sie zunächst pgcrypto in Ihrem Postgres.

CREATE EXTENSION "pgcrypto";

Setzen Sie einfach DEFAULT einer Spalte auf DEFAULT gen_random_uuid()

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.