Generieren einer UUID in Postgres for Insert-Anweisung?
Meine Frage ist ziemlich einfach. Ich bin mir bewusst das Konzept einer UUID und ich will erzeugen einen zu finden, um jedes 'Element' von 'speichern' in meiner DB mit. Sinnvoll erscheint, richtig?
Das problem ist, die folgende Zeile gibt einen Fehler zurück:
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 gelesen, die Seite an: http://www.postgresql.org/docs/current/static/uuid-ossp.html
Ich bin mit Postgres 8.4 auf Ubuntu 10.04 x64.
Kommentar zu dem Problem - Öffnen
Postgres unterstützt nativ UUID als Daten-Typ, der sogar in der Lage, die indiziert und dient als primary key. Aber generieren einen UUID-Wert, wie zu etablieren, einen Standardwert für eine Spalte benötigen Sie eine Postgres-Erweiterung (ein plugin). Viele builds (Distributionen) von Postgres eine solche Erweiterung aber nicht die Erweiterung zu aktivieren. Siehe die richtige Antwort von Craig Ringer um zu erfahren, wie es zu aktivieren.
Wenn Sie die uuid-ossp installiert & Sie weiterhin diesen Fehler erhalten, versuchen Sie, indem die Funktion mit schema-Namen, z.B.
select dbo.uuid_generate_v4()
InformationsquelleAutor der Frage anon58192932 | 2012-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
uuid-ossp
ist ein contrib-Modul, so dass es nicht in den server geladen standardmäßig. Müssen Sie laden Sie es in Ihre Datenbank zu verwenden.Für moderne PostgreSQL-Versionen (9.1 und höher), das ist einfach:
aber für 9.0 und unten, müssen Sie stattdessen führen Sie das SQL-Skript zum laden der Erweiterung. Sehen die Dokumentation für contrib-Module in 8.4.
Für Pg 9.1 und neuere stattdessen Lesen die aktuelle contrib docs und
EXTENSION
. Diese Eigenschaften existieren nicht in 9.0 oder ältere Versionen, wie Ihr 8.4.Wenn Sie eine verpackte version von PostgreSQL müssen Sie möglicherweise installieren Sie ein separates Paket mit den contrib-Module und Erweiterungen. Suchen Sie Ihre Paket-manager-Datenbank 'postgres' und 'contrib'.
InformationsquelleAutor der Antwort Craig Ringer
Ohne Erweiterungen (cheat)
(funktioniert zumindest in 8.4)
Guter Punkt von @Erwin Brandstetter
SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Auch in der modernen Postgres, können Sie einfach werfen:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
- keine Notwendigkeit für mehr MagieInformationsquelleAutor der Antwort ZuzEL
Den Antwort von Craig Ringer korrekt ist. Hier ein wenig mehr info für Postgres 9.1 und höher...
Ist Die Erweiterung Zur Verfügung?
Können Sie nur die Erweiterung installieren, wenn es bereits gebaut worden für Ihre Postgres-installation (Ihr cluster in Postgres-lingo). Zum Beispiel fand ich die uuid-ossp Erweiterung, die Bestandteil des Installationsprogramms für Mac OS X freundlich zur Verfügung gestellt durch EnterpriseDB.com. Jeder der eine einige Dutzend Erweiterungen zur Verfügung stehen können.
Um zu sehen, ob die uuid-ossp Erweiterung verfügbar ist in Ihrer Postgres-cluster, führen Sie diese SQL-Abfrage der
pg_available_extensions
- system-Katalog:Installieren Verlängerung
Installieren, UUID- bezogene Erweiterung, verwenden Sie die ERWEITERUNG ANLEGEN Befehl wie in dieser SQL:
Vorsicht: fand ich die ANFÜHRUNGSZEICHEN um Dateinamenerweiterung erforderlich zu sein, trotz Dokumentation im Gegenteil.
Des SQL-standards-committee oder Postgres-team entschied sich für ein seltsamer name für diesen Befehl. Meiner Meinung nach, sollten Sie gewählt haben, etwas wie "INSTALL EXTENSION" oder "ERWEITERUNG VERWENDEN".
Überprüfen Sie Die Installation
Können Sie überprüfen, die Erweiterung erfolgreich installiert wurde, in die gewünschte Datenbank durch ausführen dieser SQL-Abfrage der
pg_extension
- system-Katalog:UUID als Standard-Wert
Weitere Informationen finden Sie unter der Frage: Default-Wert für UUID Spalte in Postgres
Der Alte Weg
Die oben genannten Informationen verwendet die neue Erweiterungen Funktion Hinzugefügt zu Postgres 9.1. In früheren Versionen mussten wir finden und führen Sie ein Skript in einem .sql - Datei. Die Erweiterungen wurde die Funktion Hinzugefügt, um die installation zu vereinfachen, den Handel ein wenig mehr Arbeit für die Autor der Erweiterung für weniger Arbeit auf Seiten der Nutzer/Verbraucher von der Erweiterung. Siehe meine blog-post weitere Diskussion.
Arten von UUIDs
Durch die Art und Weise, den code in die Frage ruft die Funktion
uuid_generate_v4()
. Dies erzeugt eine Art bekannt als Version 4, wo fast alle der 128 bits werden zufällig generiert. Dies ist zwar gut für begrenzten Einsatz auf kleineren Satz von Zeilen, wenn Sie möchten, um praktisch zu beseitigen jede Möglichkeit einer Kollision, verwenden Sie eine andere "version" der UUID.Beispielsweise die ursprüngliche Version 1 verbindet die MAC-Adresse der host-computer mit dem aktuellen Datum-Zeit und eine beliebige Anzahl, die Wahrscheinlichkeit von Kollisionen auf nahezu null minimiert.
Weitere Diskussion, siehe meine Antwort auf Verwandte Frage stellen.
InformationsquelleAutor der Antwort Basil Bourque
pgcrypto
VerlängerungAls der PostgreSQL-9.4, die
pgcrypto
Modul beinhaltet diegen_random_uuid()
Funktion. Diese Funktion generiert eine random-Zahl basierend Version 4 Art der UUID.Bekommen contrib-Module, falls nicht schon vorhanden.
Verwenden
pgcrypto
Modul.Den
gen_random_uuid()
Funktion sollte nun verfügbar;Beispiel für die Verwendung.
Zitat von PostgreSQL-doc -
uuid-ossp
Modul.InformationsquelleAutor der Antwort brillout
Nach dem Lesen @ZuzEL Antwort, ich habe die oben genannten code als Standardwert für die Spalte id, und es funktioniert gut.
InformationsquelleAutor der Antwort Paolo Fernandes