2010-09-30 6 views
5

Sto eseguendo PostgreSQL 8.4.4 con Ubuntu 10.04.Come generare uuid con PostgreSQL 8.4.4 su Ubuntu 10.04?

Sto cercando di generare uuid ma non riesco a trovare un modo per farlo.

Io ho l'UUID-ossp.sql in /usr/share/postgresql/8.4/contrib/uuid-ossp.sql

Quando provo questo è ciò che ottengo:

postgres=# SELECT uuid_generate_v1(); 
ERROR: function uuid_generate_v1() does not exist 
LINE 1: SELECT uuid_generate_v1(); 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

Qualche idea?

risposta

12

I componenti di contrib non vengono eseguiti automaticamente. Devi eseguirlo da solo per installare le funzioni. Non conosco la versione 8.4, ma nella versione 8.3 sembra installarlo solo per database, quindi apri il database che stai utilizzando in psql e invia il comando \i /usr/share/postgresql/8.4/contrib/uuid-ossp.sql

+0

Grazie. Ha funzionato. Buono a sapersi ! – Spredzy

+0

Sì, è per database. È possibile installare tutto nel database template1 per assicurarsi che ogni nuovo database che utilizza questo database come modello (questo è l'impostazione predefinita), venga creato includendo tutti i moduli contrib. –

+0

Per le versioni correnti di Postgresql (9.0+, credo), i moduli contrib sono impacchettati come estensioni. Le estensioni sono pulite perché possono essere versionate, namespace e disinstallate. Ad esempio, è possibile installare le funzioni uuid nello schema "uuid" utilizzando il seguente comando: "create extension uuid-ossp schema uuid". Quindi accederai alle funzioni come "uuid.uuid_generate_v4()". –

1

Ho visto questo nel mio Viaggi PostgreSQL. Richiede il modulo contrib pgcrypto.

CREATE OR REPLACE FUNCTION generate_uuid() RETURNS UUID AS 
$$ 
SELECT ENCODE(GEN_RANDOM_BYTES(16), 'hex')::UUID 
$$ LANGUAGE SQL IMMUTABLE; 
+1

per quelli di noi sul retro della classe, per ottenere effettivamente roba installata in/contrib fare un sudo apt-get install postgresql-contrib. @paul grazie. –

+5

Non si dovrebbe dichiarare la funzione come IMMUTABLE perché non si desidera avere letture memorizzate nella cache al posto delle valutazioni delle funzioni. Dichiara la tua funzione come 'VOLATILE' per assicurarti che la funzione venga eseguita ogni volta che viene chiamata. Vedi http://www.postgresql.org/docs/8.3/interactive/xfunc-volatility.html per ulteriori spiegazioni. –

+0

Ottengo questo quando eseguo questa funzione: ERRORE: valore chiave duplicato viola il vincolo univoco "relation_pkey" DETTAGLIO: Key (id) = (5a0cd072-6463-2cb0-9de9-42aabb85f270) esiste già. La modifica a VOLATILE come già detto risolve il problema. –