Generowanie UUID w Postgres dla instrukcji Insert?

Moje pytanie jest dość proste. Jestem świadomy pojęcia UUID i chcę wygenerować jeden, aby odnosić się do każdego "przedmiotu"z" sklepu " w moim DB. Wydaje się rozsądne, prawda?

Problem polega na tym, że następujący wiersz zwraca błąd:

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.

Przeczytałem stronę pod adresem: http://www.postgresql.org/docs/current/static/uuid-ossp.html

Tutaj wpisz opis obrazka

[1]}uruchamiam Postgres 8.4 na Ubuntu 10.04 x64.
Author: Craig Ringer, 2012-09-20

5 answers

uuid-ossp jest modułem contrib, więc domyślnie nie jest ładowany do serwera. Musisz załadować go do bazy danych, aby z niego korzystać.

Dla nowoczesnych wersji PostgreSQL (9.1 i nowszych) to proste:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Ale dla wersji 9.0 i poniżej musisz zamiast tego uruchomić skrypt SQL, aby załadować rozszerzenie. Patrz dokumentacja modułów contrib w 8.4.

Dla Pg 9.1 i nowszych przeczytaj aktualne dokumenty contrib i CREATE EXTENSION. Funkcje te nie istnieją w wersji 9.0 lub starsze wersje, takie jak Twój 8.4.

Jeśli używasz spakowanej wersji PostgreSQL, być może będziesz musiał zainstalować oddzielny pakiet zawierający moduły i rozszerzenia contrib. Przeszukaj bazę danych menedżera pakietów pod kątem 'postgres' i 'contrib'.

 311
Author: Craig Ringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 11:35:44

Bez rozszerzeń (cheat)

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

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

(działa przynajmniej w 8.4)


Dobry punkt od @ Erwin Brandstetter do użycia clock_timestamp()

Również we współczesnych Postgresach można po prostu rzucać:

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

 180
Author: ZuzEL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 11:44:32

Odpowiedź Craiga Ringera jest prawidłowa. Oto trochę więcej informacji na temat Postgres 9.1 i późniejszych...

Czy Rozszerzenie Jest Dostępne?

Możesz zainstalować rozszerzenie tylko wtedy, gdy zostało już zbudowane dla Twojej instalacji Postgres (Twój klaster w Lingo Postgres). Na przykład znalazłem rozszerzenie uuid-ossp dołączone jako część instalatora dla Mac OS X dostarczone przez EnterpriseDB.com. każdy z kilkudziesięciu rozszerzeń {[8] } może być dostępny.

Aby sprawdzić, czy rozszerzenie uuid-ossp jest dostępne w klastrze Postgres, uruchom ten SQL, aby odpytywać pg_available_extensions katalog systemowy:

SELECT * FROM pg_available_extensions;

Zainstaluj Rozszerzenie

Aby zainstalować rozszerzenie związane z uuid , użyj CREATE EXTENSION , Jak pokazano w tym SQL:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Uwaga: uznałem, że znaki cudzysłowu wokół nazwy rozszerzenia są wymagane, mimo że dokumentacja jest przeciwna.

Komitet Standardów SQL lub zespół Postgres wybrał dziwną nazwę dla tego polecenia. Moim zdaniem powinni wybrać coś w stylu "zainstaluj rozszerzenie" lub "użyj rozszerzenia".

Weryfikacja Instalacji

Możesz sprawdzić, czy rozszerzenie zostało pomyślnie zainstalowane w żądanej bazie danych, uruchamiając ten SQL do zapytania pg_extension katalog systemu:

SELECT * FROM pg_extension;

UUID jako wartość domyślna

Aby uzyskać więcej informacji, zobacz pytanie: Domyślna wartość kolumny UUID w Postgres

The Old Way

Powyższe informacje wykorzystują nową funkcję rozszerzenia dodaną do Postgres 9.1. W poprzednich wersjach musieliśmy znaleźć i uruchomić skrypt w .plik sql. Funkcja rozszerzenia została dodana, aby ułatwić instalację, wymieniając nieco więcej pracy dla twórcy rozszerzenia dla mniej pracy ze strony użytkownika/konsumenta rozszerzenia. Zobacz mój blog post aby uzyskać więcej dyskusji.

Rodzaje UUIDs

Przy okazji, kod w pytaniu wywołuje funkcję uuid_generate_v4(). Generuje to typ znany jako Version 4, w którym prawie wszystkie 128 bitów są generowane losowo. Chociaż jest to dobre dla ograniczonego użytku na mniejszych zestawach wierszy, jeśli chcesz praktycznie wyeliminować możliwość kolizji, użyj innej" wersji " UUID.

Na przykład oryginalna Wersja 1 łączy adres MACkomputera hosta z bieżącą datą i czasem oraz dowolna liczba, prawdopodobieństwo kolizji jest praktycznie zerowe.

Aby uzyskać więcej dyskusji, zobacz moja odpowiedź na powiązane pytanie.

 55
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-16 22:42:04

pgcrypto Rozszerzenie

Począwszy od Postgres 9.4, Moduł pgcrypto zawiera gen_random_uuid() funkcja. Funkcja ta generuje jeden z typów uuid w wersji 4.

Pobierz Moduły contrib, jeśli nie są jeszcze dostępne.

sudo apt-get install postgresql-contrib-9.4

Użyj modułu pgcrypto.

CREATE EXTENSION "pgcrypto";

Funkcja gen_random_uuid() powinna być już dostępna;

Przykładowe użycie.

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


Cytat z Postgres doc on uuid-ossp moduł.

Uwaga: jeśli potrzebujesz tylko losowo generowanych (wersja 4) uuid, rozważ użycie funkcji gen_random_uuid() z modułu pgcrypto.

 43
Author: brillout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-21 01:46:26
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

Po przeczytaniu odpowiedzi @ZuzEL, użyłem powyższego kodu jako domyślnej wartości ID kolumny i działa dobrze.

 -1
Author: Paolo Fernandes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 14:57:52