it-swarm.com.de

UUID in Postgres für Insert-Anweisung generieren?

Meine Frage ist ziemlich einfach. Mir ist das Konzept einer UUID bekannt, und ich möchte eine UUID generieren, die auf jeden 'Artikel' aus einem 'Geschäft' in meiner DB mit verweist. Scheint vernünftig, oder?

Das Problem ist, dass die folgende Zeile einen Fehler zurückgibt:

honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR:  function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
        ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Ich habe die Seite unter folgender Adresse gelesen: http://www.postgresql.org/docs/current/static/uuid-ossp.html

enter image description here

Ich verwende Postgres 8.4 auf Ubuntu 10.04 x64.

293
anon58192932

_uuid-ossp_ ist ein Contrib-Modul, daher wird es standardmäßig nicht auf den Server geladen. Sie müssen es in Ihre Datenbank laden, um es zu verwenden.

Für moderne PostgreSQL-Versionen (9.1 und neuer) ist das ganz einfach:

_CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
_

ab 9.0 müssen Sie stattdessen das SQL-Skript ausführen, um die Erweiterung zu laden. Siehe die Dokumentation für Contrib-Module in 8.4 .

Für Pg 9.1 und neuer lesen Sie stattdessen die aktuellen Contrib-Dokumente und CREATE EXTENSION . Diese Funktionen sind in 9.0 oder älteren Versionen wie 8.4 nicht verfügbar.

Wenn Sie eine gepackte Version von PostgreSQL verwenden, müssen Sie möglicherweise ein separates Paket installieren, das die Contrib-Module und -Erweiterungen enthält. Durchsuchen Sie Ihre Paketmanager-Datenbank nach "postgres" und "contrib".

372
Craig Ringer

Ohne Erweiterungen (Cheat)

SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(funktioniert mindestens in 8.4)

  • Vielen Dank an @Erwin Brandstetter für die Erklärung von clock_timestamp().

Wenn Sie eine gültige v4 UUID benötigen

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

enter image description here * Danke an @ Denis Stafichuk @ Karsten und @ autronix


Außerdem können Sie in modernen Postgres einfach Folgendes besetzen:

SELECT md5(random()::text || clock_timestamp()::text)::uuid

234
ZuzEL

Das Antwort von Craig Ringer ist richtig. Hier ein paar Infos zu Postgres 9.1 und höher…

Ist eine Erweiterung verfügbar?

Sie können eine Erweiterung nur installieren, wenn sie bereits für Ihre Postgres-Installation erstellt wurde (Ihr Cluster in Postgres-Jargon). Zum Beispiel fand ich die Erweiterung id-ossp , die als Teil des Installationsprogramms für Mac OS X enthalten ist, freundlicherweise bereitgestellt von EnterpriseDB.com. Möglicherweise ist eine von einige Dutzend Erweiterungen verfügbar.

Um festzustellen, ob die Erweiterung uuid-ossp in Ihrem Postgres-Cluster verfügbar ist, führen Sie diese SQL aus, um den Systemkatalog pg_available_extensions abzufragen:

_SELECT * FROM pg_available_extensions;
_

Extension installieren

Um diese UUID - bezogene Erweiterung zu installieren, verwenden Sie den Befehl CREATE EXTENSION , wie in dieser SQL dargestellt:

_CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
_

Achtung: Ich habe festgestellt, dass die Anführungszeichen um den Erweiterungsnamen trotz gegenteiliger Dokumentation erforderlich sind.

Das SQL-Standardkomitee oder das Postgres-Team wählten einen ungeraden Namen für diesen Befehl. Meiner Meinung nach hätten sie sich für "INSTALL EXTENSION" oder "USE EXTENSION" entscheiden sollen.

Überprüfen Sie die Installation

Sie können überprüfen, ob die Erweiterung erfolgreich in der gewünschten Datenbank installiert wurde, indem Sie diese SQL ausführen, um den Systemkatalog pg_extension abzufragen:

_SELECT * FROM pg_extension;
_

UUID als Standardwert

Weitere Informationen finden Sie in der Frage: Standardwert für die UUID-Spalte in Postgres

Der alte Weg

Die obigen Informationen verwenden die neue Erweiterungsfunktion hinzugefügt für Postgres 9.1. In früheren Versionen mussten wir ein Skript in einer . Sql -Datei suchen und ausführen. Die Erweiterungsfunktion wurde hinzugefügt, um die Installation zu vereinfachen, und es wurde ein wenig mehr Arbeit für Ersteller einer Erweiterung getauscht, da der Benutzer/Verbraucher der Erweiterung weniger Arbeit hat. Weitere Informationen finden Sie in meinem Blog-Beitrag .

Arten von UUIDs

Übrigens ruft der Code in der Frage die Funktion uuid_generate_v4() auf. Dies erzeugt einen Typ, der als Version 4 bekannt ist, wobei fast alle 128 Bits zufällig erzeugt werden. Dies ist zwar für die eingeschränkte Verwendung in kleineren Reihen geeignet, aber wenn Sie Kollisionsmöglichkeiten praktisch ausschließen möchten, verwenden Sie eine andere "Version" der UUID.

Beispielsweise kombiniert das Original Version 1 das MAC-Adresse des Host-Computers mit der aktuellen Uhrzeit und einer beliebigen Zahl, die Wahrscheinlichkeit von Kollisionen ist praktisch gleich Null.

Weitere Informationen finden Sie unter meine Antwort zu verwandten Fragen.

66
Basil Bourque

pgcrypto Erweiterung

Ab Postgres 9.4 enthält das Modul pgcrypto die Funktion gen_random_uuid() . Diese Funktion generiert eine der zufallszahlenbasierten Version 4-UUID-Typen .

Holen Sie sich Contrib-Module, sofern diese nicht bereits verfügbar sind.

Sudo apt-get install postgresql-contrib-9.4

Verwenden Sie das pgcrypto Modul.

CREATE EXTENSION "pgcrypto";

Die Funktion gen_random_uuid() sollte jetzt verfügbar sein.

Anwendungsbeispiel.

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


Zitat aus Postgres doc auf uuid-ossp Modul.

Hinweis: Wenn Sie nur zufällig generierte UUIDs (Version 4) benötigen, sollten Sie stattdessen die Funktion gen_random_uuid () aus dem Modul pgcrypto verwenden.

55
brillout
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

Nachdem ich die Antwort von @ ZuzEL gelesen hatte, habe ich den obigen Code als Standardwert für die Spalten-ID verwendet und es funktioniert einwandfrei.

1
Paolo Fernandes