681 Stimmen

Generierung einer UUID in Postgres für Insert-Anweisung?

Meine Frage ist recht einfach. Ich bin mir des Konzepts einer UUID bewusst und ich möchte eine generieren, um auf jedes "Element" aus einem "Store" in meiner DB zu verweisen. Klingt 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 bei gelesen: http://www.postgresql.org/docs/current/static/uuid-ossp.html

Ich verwende Postgres 8.4 auf Ubuntu 10.04 x64.

692voto

Craig Ringer Punkte 280068

uuid-ossp ist ein Contrib-Modul und wird daher nicht standardmäßig 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 einfach:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

aber für 9.0 und darunter 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 neuere Versionen lesen Sie stattdessen die aktuellen Contrib-Dokumente y CREATE EXTENSION . Diese Funktionen gibt es nicht in 9.0 oder älteren Versionen wie 8.4.

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. Suchen Sie in der Datenbank Ihres Paketmanagers nach "postgres" und "contrib".

533voto

ZuzEL Punkte 11478

Ohne Erweiterungen (Schummeln)

Wenn Sie eine gültige v4 UUID benötigen

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

enter image description here

  • Dank an @Denis Stafichuk @Karsten y @autronix

Oder Sie können auf diese Weise einfach einen UUID-ähnlichen Wert erhalten (wenn Sie sich nicht um die Gültigkeit kümmern):

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

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

(funktioniert zumindest in 8.4)

374voto

Lukasz Szozda Punkte 137580

PostgreSQL 13 unterstützt gebürtig gen_random_uuid () :

PostgreSQL enthält eine Funktion, um eine UUID zu erzeugen:

gen_random_uuid ()  uuid

Diese Funktion gibt eine UUID der Version 4 (zufällig) zurück. Dies ist der am häufigsten verwendete UUID-Typ, der für die meisten Anwendungen geeignet ist.

db<>fiddle demo

91voto

brillout Punkte 8542

pgcrypto Erweiterung

Ab Postgres 9.4 wird die pgcrypto enthält das Modul gen_random_uuid() Funktion. Diese Funktion erzeugt eine der auf Zufallszahlen basierenden Version 4 Typ der UUID .

Holen Sie sich Contrib-Module, falls nicht bereits vorhanden.

sudo apt-get install postgresql-contrib-9.4

Verwenden Sie pgcrypto Modul.

CREATE EXTENSION "pgcrypto";

En gen_random_uuid() Funktion sollte nun verfügbar sein;

Beispiel für die Verwendung.

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

Zitat von Postgres-Dokument über uuid-ossp Modul.

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

78voto

Beki Punkte 848

Aktualisierung ab 2021, Es ist kein ausgefallener Trick nötig, um automatisch eine uuid en insert Erklärung.

Tun Sie nur eine Sache:

  1. Setzen Sie den Standardwert von DEFAULT gen_random_uuid () zu Ihrem uuid Spalte. Das ist alles.

Nehmen wir an, Sie haben eine Tabelle wie diese:

CREATE TABLE table_name (
    unique_id UUID DEFAULT gen_random_uuid (),
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    phone VARCHAR,
    PRIMARY KEY (unique_id)
);

Jetzt müssen Sie NICHTS tun, um automatisch uuid-Werte in unique_id Spalte. Denn Sie haben bereits einen Standardwert für diese Spalte definiert. Sie können sich einfach auf das Einfügen in andere Spalten konzentrieren, und postgresql kümmert sich um Ihre unique_id . Hier ist ein Beispiel für eine Einfügeanweisung:

INSERT INTO table_name (first_name, last_name, email, phone) 
VALUES (
    'Beki',
    'Otaev',
    'beki@bekhruz.com',
    '123-456-123'
)

Beachten Sie, dass es kein Einfügen in unique_id da es bereits erledigt ist.

_Über andere Erweiterungen wie uuid-ossp Wenn Sie mit dem Standard von Postgres nicht zufrieden sind, können Sie sie einschalten. gen_random_uuid () Funktion. Die meiste Zeit sollten Sie auch ohne sie auskommen_

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X