Câu trả lời:
Gọi DEFAULT
khi 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 )
)
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";
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
.
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;
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()
uuid_generate_v1mc()
uuid_generate_v3( namespace uuid, name text )
uuid_generate_v4()
uuid_generate_v5( namespace uuid, name text )
uuid_nil()
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 .
getObject()
mà bạn cũng có thể sử dụngUUID id = rs.getObject("uuid_", UUID.class);
uuid_generate_v1
hoặc uuid_generate_v1mc
.
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()