Pertanyaan saya agak sederhana. Saya mengetahui konsep UUID dan saya ingin membuat satu untuk merujuk ke setiap 'item' dari 'toko' di DB saya. Tampaknya masuk akal bukan?
Masalahnya adalah baris berikut mengembalikan kesalahan:
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.
Saya telah membaca halaman di: http://www.postgresql.org/docs/current/static/uuid-ossp.html
Saya menjalankan Postgres 8.4 di Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
sumber
sumber
select dbo.uuid_generate_v4()
Jawaban:
uuid-ossp
adalah modul contrib, jadi modul ini tidak dimuat ke server secara default. Anda harus memuatnya ke dalam basis data Anda untuk menggunakannya.Untuk versi PostgreSQL modern (9.1 dan yang lebih baru) itu mudah:
tetapi untuk 9.0 dan di bawah Anda harus menjalankan skrip SQL untuk memuat ekstensi. Lihat dokumentasi untuk modul contrib di 8.4 .
Untuk Hal 9.1 dan yang lebih baru, bacalah dokumen contrib saat ini dan
CREATE EXTENSION
. Fitur-fitur ini tidak ada dalam versi 9.0 atau yang lebih lama, seperti 8.4 Anda.Jika Anda menggunakan PostgreSQL versi paket, Anda mungkin perlu menginstal paket terpisah yang berisi modul dan ekstensi contrib. Cari basis data manajer paket Anda untuk 'postgres' dan 'contrib'.
sumber
apt-get install postgresql-contrib
atau serupa. Cobalahapt-cache search postgresql |grep contrib
untuk menemukan nama paket yang Anda inginkan.postgresql-contrib
paket, Anda akan mendapatkan kesalahan: ERROR: tidak dapat membuka file kontrol ekstensi "/usr/share/postgresql/9.3/extension/uuid-ossp.control": Tidak ada file atau direktori tersebutTanpa ekstensi (cheat)
(bekerja setidaknya dalam 8.4)
clock_timestamp()
penjelasannya.Jika Anda memerlukan UUID v4 yang valid
* Terima kasih kepada @Denis Stafichuk @ Karsten dan @autronix
Juga, di Postgres modern, Anda dapat dengan mudah memberikan:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
sumber
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, tapi saya misalnya bekerja pada contoh PostgreSQL di mana saya tidak memiliki hak yang cukup untuk menginstal ekstensi.clock_timestamp()
adalah alternatif yang lebih baik dalam hal ini. Berbedanow()
atauCURRENT_TIMESTAMP
tidak stabil dan mengembalikan waktu aktual saat ini.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Selain itu, di Postgres modern, Anda dapat menggunakan:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- tidak perlu sihir lagi. Use-case: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
The jawaban dengan Craig Ringer benar. Berikut sedikit info untuk Postgres 9.1 dan yang lebih baru ...
Apakah Ekstensi Tersedia?
Anda hanya dapat menginstal ekstensi jika sudah dibangun untuk instalasi Postgres Anda ( cluster Anda dalam istilah Postgres). Sebagai contoh, saya menemukan ekstensi uuid-ossp disertakan sebagai bagian dari penginstal untuk Mac OS X yang disediakan oleh EnterpriseDB.com. Salah satu dari beberapa lusin ekstensi mungkin tersedia.
Untuk melihat apakah ekstensi uuid-ossp tersedia di cluster Postgres Anda, jalankan SQL ini untuk meminta
pg_available_extensions
katalog sistem:Pasang Ekstensi
Untuk menginstal ekstensi terkait UUID itu , gunakan perintah CREATE EXTENSION seperti yang terlihat dalam SQL ini:
Hati-hati: Saya menemukan karakter MARK KUTIPAN di sekitar nama ekstensi diperlukan, meskipun dokumentasi sebaliknya.
Komite standar SQL atau tim Postgres memilih nama aneh untuk perintah itu. Menurut saya, mereka seharusnya memilih sesuatu seperti "INSTALL EXTENSION" atau "USE EXTENSION".
Verifikasi Instalasi
Anda dapat memverifikasi ekstensi berhasil diinstal dalam database yang diinginkan dengan menjalankan SQL ini untuk meminta
pg_extension
katalog sistem:UUID sebagai nilai default
Untuk info lebih lanjut, lihat Pertanyaan: Nilai default untuk kolom UUID di Postgres
Jalan Lama
Informasi di atas menggunakan fitur Extensions baru yang ditambahkan ke Postgres 9.1. Di versi sebelumnya, kami harus menemukan dan menjalankan skrip dalam file .sql . Fitur Extensions ditambahkan untuk membuat instalasi lebih mudah, memperdagangkan sedikit lebih banyak pekerjaan untuk pencipta ekstensi untuk lebih sedikit pekerjaan pada bagian pengguna / konsumen ekstensi. Lihat posting blog saya untuk diskusi lebih lanjut.
Jenis UUID
Ngomong-ngomong, kode dalam Pertanyaan memanggil fungsi
uuid_generate_v4()
. Ini menghasilkan jenis yang dikenal sebagai Versi 4 di mana hampir semua 128 bit dihasilkan secara acak. Meskipun ini diperbolehkan untuk penggunaan terbatas pada set baris yang lebih kecil, jika Anda ingin menghilangkan kemungkinan tabrakan, gunakan "versi" UUID lainnya.Sebagai contoh, Versi 1 asli menggabungkan alamat MAC dari komputer host dengan tanggal-waktu saat ini dan nomor yang berubah-ubah, kemungkinan tabrakan praktis nol.
Untuk diskusi lebih lanjut, lihat Jawaban saya pada Pertanyaan terkait.
sumber
CREATE EXTENSION IF NOT EXISTS ...
jika Anda tidak yakin dan tidak ingin memeriksa (dalam skrip misalnya)pgcrypto
PerpanjanganPada Postgres 9.4,
pgcrypto
modul menyertakangen_random_uuid()
fungsi. Fungsi ini menghasilkan salah satu jenis UUID versi 4 berbasis nomor acak .Dapatkan modul contrib, jika belum tersedia.
Gunakan
pgcrypto
modul.The
gen_random_uuid()
Fungsi sekarang harus tersedia;Contoh penggunaan.
Kutipan dari Postgres doc on
uuid-ossp
module.sumber
Setelah membaca jawaban @ ZuzEL, saya menggunakan kode di atas sebagai nilai default id kolom dan berfungsi dengan baik.
sumber
PostgreSQL 13 yang akan datang akan mendukung native gen_random_uuid () tanpa perlu mengaktifkan ekstensi apa pun:
db <> demo biola
sumber