Nilai default untuk kolom UUID di Postgres


Jawaban:


94

tl; dr

Panggil DEFAULTketika mendefinisikan kolom untuk memanggil salah satu fungsi uuid OSSP . Server Postgres akan secara otomatis menjalankan fungsi setiap kali sebuah baris dimasukkan.

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

Jika Anda sudah menggunakan ekstensi pgcrypto , pertimbangkan Jawaban dengan bpieck .

Diperlukan Plugin Untuk Menghasilkan UUID

Sementara Postgres out-of-the-box mendukung penyimpanan nilai-nilai UUID (Universally Unique Identifier) dalam bentuk 128-bit asalnya , menghasilkan nilai-nilai UUID memerlukan plug-in. Di Postgres, sebuah plug-in dikenal sebagai extension.

Untuk menginstal ekstensi, hubungi CREATE EXTENSION. Untuk menghindari menginstal ulang, tambahkan IF NOT EXISTS. Lihat posting blog saya untuk lebih jelasnya, atau lihat halaman ini di StackOverflow .

Ekstensi yang kami inginkan adalah pustaka sumber terbuka yang dibangun di C untuk bekerja dengan UUID, OSSP uuid . Sebuah membangun perpustakaan ini untuk Postgres sering dibundel dengan instalasi Postgres seperti installer grafis yang disediakan oleh Perusahaan DB atau termasuk oleh penyedia cloud seperti Amazon RDS untuk PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Menghasilkan Berbagai Macam UUID

Lihat dokumen ekstensi untuk melihat daftar beberapa perintah yang ditawarkan untuk menghasilkan berbagai jenis nilai UUID. Untuk mendapatkan versi asli UUID yang dibangun dari alamat MAC komputer plus waktu-tanggal saat ini plus nilai acak kecil, hubungi uuid_generate_v1().

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

Kemudian variasi pada tema ini dikembangkan untuk jenis-jenis UUID alternatif. Beberapa orang mungkin tidak ingin merekam alamat MAC server yang sebenarnya, misalnya, untuk masalah keamanan atau privasi. Perpanjangan Postgres menghasilkan lima jenis UUID, ditambah UUID “nihil” 00000000-0000-0000-0000-000000000000.

UUID Sebagai Nilai Default

Pemanggilan metode itu dapat dilakukan secara otomatis untuk menghasilkan nilai default untuk setiap baris yang baru saja dimasukkan. Saat mendefinisikan kolom, tentukan:

DEFAULT uuid_generate_v1()

Lihat perintah yang digunakan dalam definisi tabel contoh berikut.

CREATE TABLE public.pet_
(
  species_ text NOT NULL,
  name_ text NOT NULL,
  date_of_birth_ text NOT NULL,
  uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
  CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pet_
  OWNER TO postgres;

Versi UUID

The uuid-ossp Plugin dapat menghasilkan berbagai versi UUID .

  • uuid_generate_v1()
    Berisi alamat MAC komputer saat ini + momen saat ini. Biasa digunakan, tetapi hindari jika Anda sensitif mengungkapkan MAC server database Anda atau waktu ketika nilai ini dihasilkan. Didefinisikan oleh spesifikasi sebagai UUID Versi 1 .
  • uuid_generate_v1mc()
    Seperti Versi 1 , tetapi dengan alamat MAC multicast acak, bukan alamat MAC asli. Tampaknya cara untuk menggunakan Versi 1 tetapi mengganti MAC lain daripada MAC sebenarnya dari server database Anda jika Anda sensitif mengungkapkan fakta itu.
    Apa itu 'multicast MAC acak'? Saya tidak tahu persis . Setelah membaca bagian 4.1.6 dari RFC 4122 , saya menduga ini adalah angka acak yang digunakan sebagai pengganti MAC tetapi dengan bit yang ditetapkan untuk menunjukkan alamat MAC multicast daripada unicast biasa sehingga dapat membedakan variasi Versi 1 ini dari biasanya real-MAC Versi 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    Berisi hash MD5 teks yang Anda berikan. Didefinisikan oleh spesifikasi sebagai UUID Versi 3 , UUID berbasis namespace .
  • uuid_generate_v4()
    Berdasarkan data yang dihasilkan secara acak untuk 121-122 dari 128 bit. Enam atau tujuh bit digunakan untuk menunjukkan Versi & Varian. UUID semacam ini praktis hanya jika diterapkan dengan generator acak yang kuat secara kriptografis . Didefinisikan oleh spesifikasi sebagai UUID Versi 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Sama seperti Versi 3 tetapi menggunakan hashing SHA1 . Didefinisikan oleh spesifikasi sebagai Versi 5 UUID .
  • uuid_nil()
    Kasus khusus, semua bit diatur ke nol 00000000-0000-0000-0000-000000000000. Digunakan sebagai bendera untuk nilai UUID yang tidak diketahui. Dikenal sebagai UUID nihil .

Untuk membandingkan jenis, lihat Pertanyaan, Versi UUID mana yang digunakan?

Jika Anda ingin tahu tentang Versi 3 & 5, lihat Pertanyaan ini, Menghasilkan UUID v5. Apa itu nama dan namespace? .

Untuk diskusi lebih lanjut, lihat Jawaban saya untuk Pertanyaan serupa dan nilai posting UUID blog saya dari JDBC ke Postgres .


1.000.000 klik di Google untuk cara membuat kolom jenis UUID. Tidak ada hit untuk cara menakuti baris kueri oleh pk itu !! : - @
Clint Eastwood

@ClintEastwood Jawaban Saya untuk Pertanyaan serupa dan nilai posting UUID blog saya dari JDBC ke Postgres mungkin membantu Anda dengan itu. Jika itu terbukti tidak mencukupi, poskan Pertanyaan baru. Saya dengan senang hati akan menikamnya lagi. Saya mengerti frustrasi Anda!
Basil Bourque

@ClintEastwood: sintaks untuk membandingkan kolom UUID dengan nilai mengikuti sintaks untuk konstanta yang didokumentasikan dalam manual: postgresql.org/docs/current/static/… dan ketik gips: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: Ini tidak benar-benar perlu untuk melemparkan hasil getObject()Anda juga dapat menggunakanUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit Untuk memverifikasi kekuatan generator angka acak, lihat implementasi open-source yang mendasarinya yang dibungkus oleh ekstensi Postgres ini, proyek pustaka uuid OSSP seperti disebutkan dalam Jawaban saya. Dan ingat, Versi 4 UUID harus digunakan hanya sebagai upaya terakhir, jika karena alasan tertentu Anda tidak dapat memilih jenis lainnya. Umumnya, pilihan pertama Anda harus jenis Versi 1, dengan memanggil salah satu uuid_generate_v1atau uuid_generate_v1mc.
Basil Bourque

8

ekstensi pgcrypto

Hanya tambahan kecil untuk jawaban Basil yang sangat terperinci:

Sejak saat kebanyakan menggunakan pgcrypto , bukan uuid_generate_v1()Anda dapat menggunakan gen_random_uuid()untuk UUID Versi 4 nilai.

Pertama, aktifkan pgcrypto di Postgres Anda.

CREATE EXTENSION "pgcrypto";

Setel DEFAULT sebuah kolom ke DEFAULT gen_random_uuid()

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.