Giá trị mặc định cho cột UUID trong Postgres


Câu trả lời:


92

tl; dr

Gọi DEFAULTkhi xác định một cột để gọi một trong các hàm uuid OSSP . Máy chủ Postgres sẽ tự động gọi chức năng mỗi khi một hàng được chèn.

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

Cần có Plugin để tạo UUID

Mặc dù Postgres out-of-the-box hỗ trợ lưu trữ các giá trị UUID (Mã định danh duy nhất toàn cầu) ở dạng 128 bit gốc của chúng, việc tạo các giá trị UUID cần có trình cắm. Trong Postgres, một trình cắm thêm được gọi là một extension.

Để cài đặt một phần mở rộng, hãy gọi CREATE EXTENSION. Để tránh cài đặt lại, thêm IF NOT EXISTS. Xem bài đăng trên blog của tôi để biết thêm chi tiết hoặc xem trang này trong StackOverflow .

Phần mở rộng mà chúng tôi muốn là một thư viện mã nguồn mở được xây dựng trong C để làm việc với UUID, OSSP uuid . Bản dựng của thư viện này cho Postgres thường được gói cùng với bản cài đặt Postgres như trình cài đặt đồ họa do Enterprise DB cung cấp hoặc được cung cấp bởi các nhà cung cấp đám mây như Amazon RDS cho PostgreQuery .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Tạo ra nhiều loại UUID

Xem tài liệu của tiện ích mở rộng để xem danh sách nhiều lệnh được cung cấp để tạo các loại giá trị UUID khác nhau. Để có phiên bản gốc của UUID được xây dựng từ địa chỉ MAC của máy tính cộng với thời gian ngày hiện tại cộng với một giá trị ngẫu nhiên nhỏ, hãy gọi uuid_generate_v1().

SELECT uuid_generate_v1();

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

Các biến thể sau này về chủ đề này đã được phát triển cho các loại UUID thay thế. Một số người có thể không muốn ghi lại địa chỉ MAC thực tế của máy chủ, ví dụ, vì những lo ngại về bảo mật hoặc quyền riêng tư. Tiện ích mở rộng Postgres tạo ra năm loại UUID, cộng với UUID của Nil 00000000-0000-0000-0000-000000000000.

UUID làm giá trị mặc định

Cuộc gọi phương thức đó có thể được thực hiện tự động để tạo giá trị mặc định cho bất kỳ hàng nào mới được chèn. Khi xác định cột, chỉ định:

DEFAULT uuid_generate_v1()

Xem lệnh đó được sử dụng trong định nghĩa bảng ví dụ sau đây.

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;

Phiên bản UUID

Các uuid-OSSP plugin có thể tạo ra các phiên bản khác nhau của UUID .

  • uuid_generate_v1()
    Chứa địa chỉ MAC của máy tính hiện tại + thời điểm hiện tại. Thường được sử dụng, nhưng tránh nếu bạn nhạy cảm về việc tiết lộ MAC của máy chủ cơ sở dữ liệu của bạn hoặc thời điểm khi giá trị này được tạo. Được xác định bởi đặc tả là UUID phiên bản 1 .
  • uuid_generate_v1mc()
    Giống như Phiên bản 1 , nhưng với một địa chỉ MAC phát đa hướng ngẫu nhiên thay vì địa chỉ MAC thực. Rõ ràng là một cách để sử dụng Phiên bản 1 nhưng thay thế MAC khác thay vì MAC thực tế của máy chủ cơ sở dữ liệu của bạn nếu bạn nhạy cảm về việc tiết lộ sự thật đó.
    'MAC đa hướng ngẫu nhiên' là gì? Tôi không biết chính xác . Sau khi đọc phần 4.1.6 của RFC 4122 , tôi nghi ngờ đây là số ngẫu nhiên được sử dụng thay cho MAC nhưng với các bit được đặt để chỉ địa chỉ MAC phát đa hướng thay vì unicast thông thường để phân biệt biến thể của Phiên bản 1 này với thông thường real-MAC Phiên bản 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    Chứa hàm băm MD5 mà bạn cung cấp. Được xác định bởi đặc tả là UUID phiên bản 3 , UUID dựa trên không gian tên .
  • uuid_generate_v4()
    Dựa trên dữ liệu được tạo ngẫu nhiên cho 121-122 trong số 128 bit. Sáu hoặc bảy bit được sử dụng để chỉ Phiên bản & Biến thể. Loại UUID này chỉ thực tế nếu được triển khai với trình tạo ngẫu nhiên mạnh về mật mã . Được xác định bởi đặc tả là UUID phiên bản 4 .
  • uuid_generate_v5( namespace uuid, name text )
    Tương tự như Phiên bản 3 nhưng sử dụng băm SHA1 . Được xác định bởi đặc điểm kỹ thuật là UUID phiên bản 5 .
  • uuid_nil()
    Một trường hợp đặc biệt, tất cả các bit được đặt thành không 00000000-0000-0000-0000-000000000000. Được sử dụng làm cờ cho giá trị UUID không xác định. Được biết đến như một UUID không .

Để so sánh các loại, hãy xem Câu hỏi, nên sử dụng phiên bản UUID nào?

Nếu bạn tò mò về Phiên bản 3 & 5, hãy xem Câu hỏi này, Tạo v5 UUID. Tên và không gian tên là gì? .

Để thảo luận thêm, hãy xem Câu trả lời của tôi cho Câu hỏi tương tự và blog của tôi đăng các giá trị UUID từ JDBC sang Postgres .


1.000.000 lượt truy cập trong Google để biết cách tạo các cột loại UUID. Không có lượt truy cập nào về cách làm hoảng loạn các hàng truy vấn bằng pk đó !! : - @
Clint Eastwood

@ClintEastwood Câu trả lời của tôi cho một Câu hỏi tương tự và blog của tôi đăng các giá trị UUID từ JDBC sang Postgres có thể giúp bạn điều đó. Nếu những điều đó không đủ, hãy đăng một Câu hỏi mới. Tôi rất vui khi nhận được một cú đâm khác vào nó. Tôi hiểu sự thất vọng của bạn!
Basil Bourque

@ClintEastwood: cú pháp để so sánh một cột UUID với một giá trị sau cú pháp cho các hằng số ghi nhận trong cuốn hướng dẫn: postgresql.org/docs/current/static/... và loại phôi: postgresql.org/docs/current/static/...
a_horse_with_no_name

1
@BasilBourque: Không thực sự cần thiết để đưa ra kết quả getObject()mà bạn cũng có thể sử dụngUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit Để xác minh độ mạnh của trình tạo số ngẫu nhiên, hãy xem triển khai nguồn mở cơ bản được bao bọc bởi phần mở rộng Postgres này, dự án thư viện uSS OSSP như được đề cập trong Câu trả lời của tôi. Và hãy nhớ rằng, UUID phiên bản 4 chỉ nên được sử dụng như là phương sách cuối cùng, nếu vì lý do nào đó bạn không thể chọn các loại khác. Nói chung, lựa chọn đầu tiên của bạn phải là loại Phiên bản 1, bằng cách gọi một trong hai uuid_generate_v1hoặc uuid_generate_v1mc.
Basil Bourque

7

mở rộng pgcrypto

Chỉ là một bổ sung nhỏ cho câu trả lời rất chi tiết của Basil:

Vì hiện tại hầu hết đang sử dụng pgcrypto , thay vì uuid_generate_v1()bạn có thể sử dụng gen_random_uuid()cho giá trị UUID phiên bản 4 .

Đầu tiên, kích hoạt pgcrypto trong Postgres của bạn.

CREATE EXTENSION "pgcrypto";

Chỉ cần đặt DEFAULT của một cột thành DEFAULT gen_random_uuid()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.