Postgres'te UUID sütunu için varsayılan değer


Yanıtlar:


92

tl; Dr.

OSSP uuid işlevlerinden DEFAULTbirini çağırmak için bir sütun tanımlarken arayın . Postgres sunucusu, her satır eklendiğinde işlevi otomatik olarak çağırır.

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

UUID Oluşturmak İçin Gerekli Eklenti

Birlikte Postgres dışı Kutudan destekler depolanması UUID (Evrensel benzersiz tanıtıcı) kendi doğal değerleri 128 bit , form üretme UUID'si değerleri bir plug-in gerektirir. PostGres'te bir eklenti olarak bilinir extension.

Bir eklenti yüklemek için arayın CREATE EXTENSION. Yeniden kurmaktan kaçınmak için ekleyin IF NOT EXISTS. Daha fazla ayrıntı için blog gönderime bakın veya bu sayfayı StackOverflow'ta görün .

İstediğimiz uzantı, UUID'lerle , OSSP uuid'iyle çalışmak için C'ye yerleştirilmiş açık kaynaklı bir kütüphanedir . Postgres için bu kütüphanenin bir derlemesi, Enterprise DB tarafından sağlanan grafik kurucular veya PostgreSQL için Amazon RDS gibi bulut sağlayıcılar tarafından dahil edilen Postgres kurulumu ile birlikte gelir .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Çeşitli UUID Çeşitleri Üretmek

Çeşitli UUID değerleri üretmek için sunulan birden çok komutun listesini görmek için uzantının belgesine bakın. Bilgisayarın MAC adresinden ve geçerli tarih saatinden ve küçük bir rastgele değerden oluşturulmuş orijinal UUID sürümünü edinmek için arayın uuid_generate_v1().

SELECT uuid_generate_v1();

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

Daha sonra, bu UUID'lerin alternatif türleri için bu temadaki farklılıklar geliştirilmiştir. Bazı insanlar, güvenlik veya gizlilik endişeleri gibi, sunucunun gerçek MAC adresini kaydetmek istemeyebilir. Postgres eklentisi beş çeşit UUID, artı “nil” UUID üretir 00000000-0000-0000-0000-000000000000.

Varsayılan Değer Olarak UUID

Yeni eklenen herhangi bir satır için varsayılan bir değer oluşturmak üzere bu yöntem çağrısı otomatik olarak yapılabilir. Sütunu tanımlarken, belirtin:

DEFAULT uuid_generate_v1()

Aşağıdaki örnek tablo tanımında kullanılan komutu görün.

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;

UUID sürümleri

Uuid-ossp eklentisi üretebilir UUID çeşitli versiyonlarını .

  • uuid_generate_v1()
    İçeren MAC adresini akım bilgisayara + akım anın. Yaygın olarak kullanılır, ancak veritabanı sunucunuzun MAC'ini veya bu değerin üretildiği zamanı açıklamak konusunda hassas olup olmadığınızdan kaçının. Sürüm 1 UUID olarak belirtime göre tanımlanır .
  • uuid_generate_v1mc()
    Gibi Version 1 , ancak bunun yerine gerçek MAC adresini rasgele noktaya yayın MAC adresi ile. Görünüşe göre Versiyon 1'i kullanmak, ancak bu gerçeği açıklama konusunda duyarlıysanız, veritabanı sunucunuzun asıl MAC'ı yerine başka bir MAC kullanmak yerine.
    'Rastgele çok noktaya yayın MAC' nedir? Ben tam olarak bilmiyorum . RFC 4122'nin 4.1.6 bölümünü okuduktan sonra , bunun MAC yerine kullanılan rastgele bir sayı olduğundan, ancak Versiyon 1'in bu varyasyonunu normalden ayırt etmek için normal tek noktaya yayın yerine çok noktaya yayın MAC adresini belirtmek üzere ayarlanmış bitler olduğunu düşünüyorum. real-MAC Versiyon 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    Sağladığınız bir MD5 karma metin içeriyor . Sürüm 3 UUID , ad alanı tabanlı UUID olarak belirtimle tanımlanır .
  • uuid_generate_v4()
    128 bitin 121-122'si için rastgele oluşturulmuş verilere dayanarak. Sürüm ve Varyantı belirtmek için altı veya yedi bit kullanılır. Bu tür UUID, yalnızca kriptografik olarak güçlü bir rasgele oluşturucu ile uygulandığında pratiktir . Sürüm 4 UUID olarak belirtime göre tanımlanır .
  • uuid_generate_v5( namespace uuid, name text )
    Sürüm 3 ile aynı, ancak SHA1 karma kullanması . Şartname ile Sürüm 5 UUID olarak tanımlanır .
  • uuid_nil()
    Özel bir durum, tüm bitler sıfıra ayarlanmış 00000000-0000-0000-0000-000000000000. Bilinmeyen bir UUID değeri için bayrak olarak kullanılır. Nil UUID olarak bilinir .

Türleri karşılaştırmak için bkz. Soru, Hangi UUID sürümünü kullanmalı?

Sürüm 3 ve 5'i merak ediyorsanız, v5 UUID Oluşturma adlı bu soruya bakın. İsim ve isim alanı nedir? .

Daha fazla tartışma için, bkz benim cevap benzer Soru ve benim blog yazısı Postgres için JDBC gelen UUID değerlerini .


UUID türü sütunların nasıl oluşturulacağı konusunda Google'da 1.000.000 hit. Sorgu satırlarının bu pk tarafından nasıl korktuğunu gösteren sıfır vuruş !! : - @
Clint Eastwood

@ClintEastwood Yanıtım benzer Soru ve benim blog yazısı Postgres için JDBC gelen UUID değerleri bu konuda size yardımcı olabilir. Bunlar yetersiz olduğunu kanıtlarsa, yeni bir soru gönderin. Başka bir bıçak çektirmekten mutlu olurum. Hayal kırıklığını anlıyorum!
Basil Bourque

@ClintEastwood: değeri olan bir UUID sütunu karşılaştırmak için kullanılan sözdizim, kılavuzda belgelenen sabitlerin sözdizimini takip eder: postgresql.org/docs/current/static/… ve type casts: postgresql.org/docs/current/static/…
a_horse_with_no_name

1
@BasilBourque: getObject()Ayrıca kullanabileceğiniz sonucunu UUID id = rs.getObject("uuid_", UUID.class);
yayınlamanıza gerek yok

1
@Rokit Rastgele sayı üretecinin gücünü doğrulamak için Cevabımda belirtilen şekilde OSSP kullanıcı kütüphane projesi olan bu Postgres eklentisi tarafından sarılmış altta açık kaynak kodlu uygulamaya bakın . Unutmayın, Sürüm 4 UUID'ler yalnızca son çare olarak kullanılmalıdır, eğer bir nedenden ötürü diğer tipleri seçemezsiniz. Genel olarak, ilk tercihiniz uuid_generate_v1veya 1'i arayarak Sürüm 1 türü olmalıdır uuid_generate_v1mc.
Basil Bourque

7

pgcrypto uzantısı

Basil'in çok ayrıntılı cevabına küçük bir eklenti:

Şu anda çoğu pgcrypto kullandığından , bunun yerine Sürüm 4 UUID değeri için uuid_generate_v1()kullanabilirsiniz .gen_random_uuid()

İlk olarak, Postgres'te pgcrypto'yu etkinleştir

CREATE EXTENSION "pgcrypto";

Sadece bir sütunun DEFAULT değerini DEFAULT gen_random_uuid()

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.