Meine Frage ist ziemlich einfach. Ich kenne das Konzept einer UUID und möchte eine generieren, die auf jedes 'Element' aus einem 'Geschäft' in meiner Datenbank 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
Ich verwende Postgres 8.4 unter Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
quelle
quelle
select dbo.uuid_generate_v4()
Antworten:
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 verwenden zu können.Für moderne PostgreSQL-Versionen (9.1 und neuer) ist das einfach:
Für 9.0 und niedriger müssen Sie stattdessen das SQL-Skript ausführen, um die Erweiterung zu laden. Weitere Informationen finden Sie in der Dokumentation zu Contrib-Modulen in 8.4 .
Lesen Sie stattdessen für Seite 9.1 und höher die aktuellen Beiträge und Dokumente
CREATE EXTENSION
. Diese Funktionen sind in 9.0 oder älteren Versionen wie 8.4 nicht vorhanden.Wenn Sie eine Paketversion 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".
quelle
apt-get install postgresql-contrib
oder ähnlich zu arbeiten. Versuchenapt-cache search postgresql |grep contrib
Sie, den gewünschten Paketnamen zu finden.postgresql-contrib
Paket nicht installieren , die folgende Fehlermeldung angezeigtOhne Erweiterungen (Cheat)
(funktioniert mindestens in 8.4)
clock_timestamp()
Erklärung.Wenn Sie eine gültige v4-UUID benötigen
* Danke an @Denis Stafichuk @Karsten und @autronix
In modernen Postgres können Sie auch einfach Folgendes besetzen:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
quelle
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, aber ich arbeite zum Beispiel an einer PostgreSQL-Instanz, bei der ich nicht über die erforderlichen Berechtigungen zum Installieren einer Erweiterung verfüge .clock_timestamp()
ist in jedem Fall die bessere Alternative dafür. Im Gegensatz zunow()
oder istCURRENT_TIMESTAMP
es volatil und gibt die aktuelle Uhrzeit zurück.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
In modernen Postgres können Sie auch einfach Folgendes wirken:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- Keine Notwendigkeit für mehr Magie. Anwendungsfall: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
Die 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 uuid-ossp, die im Installationsprogramm für Mac OS X enthalten ist und freundlicherweise von EnterpriseDB.com bereitgestellt wird. Jede von ein paar Dutzend Erweiterungen verfügbar sein.
Führen Sie diese SQL aus, um den Systemkatalog abzufragen, um festzustellen, ob die Erweiterung uuid-ossp in Ihrem Postgres-Cluster verfügbar ist
pg_available_extensions
:Installation installieren
Verwenden Sie zum Installieren dieser UUID- bezogenen Erweiterung den Befehl CREATE EXTENSION, wie in dieser SQL dargestellt:
Achtung: Ich habe festgestellt, dass die QUOTATION MARK-Zeichen um den Erweiterungsnamen trotz gegenteiliger Dokumentation erforderlich sind.
Das SQL-Standardkomitee oder das Postgres-Team haben einen ungeraden Namen für diesen Befehl gewählt. Meiner Meinung nach hätten sie etwas wie "INSTALL EXTENSION" oder "USE EXTENSION" wählen 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
pg_extension
Systemkatalog abzufragen :UUID als Standardwert
Weitere Informationen finden Sie in der Spalte Frage: Standardwert für UUID in Postgres
Der alte Weg
Die oben genannten Informationen verwenden die neuen Erweiterungen Feature hinzugefügt , um Postgres 9.1. In früheren Versionen mussten wir ein Skript in einer SQL- Datei finden und ausführen . Die Erweiterungsfunktion wurde hinzugefügt, um die Installation zu vereinfachen und dem Ersteller einer Erweiterung etwas mehr Arbeit gegen weniger Arbeit seitens des Benutzers / Verbrauchers der Erweiterung einzutauschen. Weitere Diskussionen finden Sie in meinem Blogbeitrag .
Arten von UUIDs
Der Code in der Frage ruft übrigens die Funktion auf
uuid_generate_v4()
. Dies erzeugt einen als Version 4 bekannten Typ, bei dem fast alle 128 Bits zufällig erzeugt werden. Während dies für die eingeschränkte Verwendung in kleineren Zeilengruppen in Ordnung ist, verwenden Sie eine andere "Version" von UUID, wenn Sie die Möglichkeit einer Kollision praktisch ausschließen möchten.Beispielsweise kombiniert die ursprüngliche Version 1 die MAC-Adresse des Host-Computers mit dem aktuellen Datum und der Uhrzeit und einer beliebigen Zahl. Die Wahrscheinlichkeit von Kollisionen ist praktisch gleich Null.
Weitere Informationen finden Sie in meiner Antwort auf die zugehörige Frage.
quelle
CREATE EXTENSION IF NOT EXISTS ...
wenn Sie nicht sicher sind und nicht überprüfen möchten (in einem Skript zB)pgcrypto
ErweiterungAb Postgres 9.4 enthält das
pgcrypto
Modul diegen_random_uuid()
Funktion. Diese Funktion generiert einen auf Zufallszahlen basierenden UUID-Typ der Version 4 .Holen Sie sich Contrib-Module, falls nicht bereits verfügbar.
Verwenden
pgcrypto
Modul.Die
gen_random_uuid()
Funktion sollte jetzt verfügbar sein.Anwendungsbeispiel.
Zitat aus dem Postgres-Dokument zum
uuid-ossp
Modul.quelle
Nachdem ich die Antwort von @ ZuzEL gelesen hatte, verwendete ich den obigen Code als Standardwert für die Spalten-ID und es funktioniert einwandfrei.
quelle
Das kommende PostgreSQL 13 unterstützt nativ gen_random_uuid (), ohne dass Erweiterungen aktiviert werden müssen:
db <> Geigen-Demo
quelle