Moje pytanie jest raczej proste. Jestem świadomy koncepcji identyfikatora UUID i chcę wygenerować taki, aby odnosił się do każdego „elementu” z „sklepu” w mojej bazie danych. Wydaje się uzasadnione, 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ę: http://www.postgresql.org/docs/current/static/uuid-ossp.html
Używam Postgres 8.4 na Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
źródło
źródło
select dbo.uuid_generate_v4()
Odpowiedzi:
uuid-ossp
jest modułem contrib, więc domyślnie nie jest ładowany na serwer. Aby go użyć, musisz załadować go do swojej bazy danych.Dla współczesnych wersji PostgreSQL (9.1 i nowszych) to łatwe:
ale dla wersji 9.0 i niższych musisz zamiast tego uruchomić skrypt SQL, aby załadować rozszerzenie. Zobacz dokumentację modułów contrib w 8.4 .
Dla Pg 9.1 i nowszych przeczytaj aktualne dokumenty contrib i
CREATE EXTENSION
. Te funkcje nie istnieją w wersji 9.0 lub starszych, takich jak 8.4.Jeśli używasz pakietowej wersji PostgreSQL, może być konieczne zainstalowanie osobnego pakietu zawierającego moduły contrib i rozszerzenia. Wyszukaj w bazie danych menedżera pakietów „postgres” i „contrib”.
źródło
apt-get install postgresql-contrib
lub podobnie. Spróbujapt-cache search postgresql |grep contrib
znaleźć żądaną nazwę pakietu.postgresql-contrib
pakietu, pojawi się błąd: BŁĄD: nie można otworzyć pliku sterującego rozszerzeniem „/usr/share/postgresql/9.3/extension/uuid-ossp.control”: Brak takiego pliku lub kataloguBez rozszerzeń (cheat)
(działa co najmniej w 8.4)
clock_timestamp()
wyjaśnienie.Jeśli potrzebujesz prawidłowego UUID v4
* Dzięki @Denis Stafichuk @Karsten i @autronix
Ponadto we współczesnym Postgres możesz po prostu rzucić:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
źródło
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, ale pracuję na przykład nad instancją PostgreSQL, w której nie mam wystarczających uprawnień, aby zainstalować rozszerzenie.clock_timestamp()
jest lepszą alternatywą w obu przypadkach. W przeciwieństwie donow()
lubCURRENT_TIMESTAMP
jest niestabilny i zwraca aktualny aktualny czas.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Ponadto we współczesnym Postgresie możesz po prostu rzucić:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- nie potrzebujesz więcej magii. Przypadek użycia: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
Odpowiedź Craig Ringer jest poprawna. Oto trochę więcej informacji na temat Postgres 9.1 i nowszych…
Czy dostępne jest rozszerzenie?
Rozszerzenie można zainstalować tylko wtedy, gdy zostało ono już zbudowane do instalacji Postgres ( klaster w języku Lingo Postgres). Na przykład znalazłem rozszerzenie uuid-ossp zawarte w ramach instalatora dla systemu Mac OS X udostępnionego przez EnterpriseDB.com. Dostępne może być dowolne z kilkudziesięciu rozszerzeń .
Aby sprawdzić, czy rozszerzenie uuid-ossp jest dostępne w klastrze Postgres, uruchom ten kod SQL, aby wysłać zapytanie do
pg_available_extensions
katalogu systemowego:Zainstaluj rozszerzenie
Aby zainstalować to rozszerzenie związane z UUID , użyj polecenia CREATE EXTENSION, jak widać w tym SQL:
Uwaga: Znalazłem wymagane znaki ZNAK QUOTATION wokół nazwy rozszerzenia, mimo że dokumentacja jest wręcz przeciwna.
Komitet ds. Standardów SQL lub zespół Postgres wybrał dla tego polecenia nieparzystą nazwę. Moim zdaniem powinni wybrać coś takiego jak „ZAINSTALUJ PRZEDŁUŻENIE” lub „UŻYJ PRZEDŁUŻENIA”.
Sprawdź instalację
Możesz sprawdzić, czy rozszerzenie zostało pomyślnie zainstalowane w wybranej bazie danych, uruchamiając ten kod SQL w celu przeszukania
pg_extension
katalogu systemowego:UUID jako wartość domyślna
Aby uzyskać więcej informacji, zobacz pytanie: Wartość domyślna dla kolumny UUID w Postgres
The Old Way
Powyższe informacje wykorzystują nową funkcję Rozszerzeń dodaną do Postgres 9.1. W poprzednich wersjach musieliśmy znaleźć i uruchomić skrypt w pliku .sql . Dodano funkcję Rozszerzenia, aby ułatwić instalację, zamieniając nieco więcej pracy dla twórcy rozszerzenia na mniej pracy ze strony użytkownika / konsumenta rozszerzenia. Zobacz mój post na blogu, aby uzyskać więcej dyskusji.
Rodzaje UUID
Nawiasem mówiąc, kod w pytaniu wywołuje funkcję
uuid_generate_v4()
. Generuje to typ znany jako Wersja 4, w której prawie wszystkie 128 bitów jest generowanych losowo. Chociaż jest to odpowiednie w przypadku ograniczonego użycia w mniejszym zestawie wierszy, jeśli chcesz praktycznie wyeliminować jakąkolwiek możliwość kolizji, użyj innej „wersji” UUID.Na przykład oryginalna wersja 1 łączy adres MAC komputera-hosta z bieżącą datą i godziną i dowolną liczbą, prawdopodobieństwo kolizji jest praktycznie zerowe.
Aby uzyskać więcej dyskusji, zobacz moją odpowiedź na powiązane pytanie.
źródło
CREATE EXTENSION IF NOT EXISTS ...
jeśli nie jesteś pewien i nie chcesz sprawdzić (np. W skrypcie)pgcrypto
RozbudowaPocząwszy od Postgres 9.4,
pgcrypto
moduł zawieragen_random_uuid()
funkcję. Ta funkcja generuje jeden z UUID typu 4 w oparciu o liczby losowe .Zdobądź moduły contrib, jeśli jeszcze nie są dostępne.
Użyj
pgcrypto
modułu.gen_random_uuid()
Funkcja powinna teraz dostępne;Przykładowe użycie.
Cytat z dokumentu Postgres w
uuid-ossp
module.źródło
Po przeczytaniu odpowiedzi @ ZuzEL użyłem powyższego kodu jako domyślnej wartości identyfikatora kolumny i działa dobrze.
źródło
Nadchodząca PostgreSQL 13 będzie obsługiwać natywnie gen_random_uuid () bez potrzeby włączania jakichkolwiek rozszerzeń:
db <> demo skrzypiec
źródło