Dựa trên các nhận xét và câu trả lời ở đây, và một số nghiên cứu sơ bộ, tôi có bản tóm tắt sau đây để đưa ra nhận xét từ Postgres-erati. Sẽ thực sự đánh giá cao ý kiến đóng góp của bạn.
Có ba cách để hạn chế các mục nhập trong cột bảng cơ sở dữ liệu Postgres. Hãy xem xét một bảng để lưu trữ "màu sắc" trong đó bạn chỉ muốn 'đỏ', 'xanh lá cây' hoặc 'xanh lam' là các mục nhập hợp lệ.
-
Kiểu dữ liệu được liệt kê
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
Ưu điểm là kiểu có thể được xác định một lần và sau đó được sử dụng lại trong nhiều bảng nếu cần. Một truy vấn chuẩn có thể liệt kê tất cả các giá trị cho một loại ENUM và có thể được sử dụng để tạo các tiện ích biểu mẫu ứng dụng.
SELECT n.nspname AS enum_schema, t.typname AS enum_name, e.enumlabel AS enum_value FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'valid_colors' enum_schema | enum_name | enum_value -------------+---------------+------------ public | valid_colors | red public | valid_colors | green public | valid_colors | blue
Nhược điểm là, kiểu ENUM được lưu trữ trong các danh mục hệ thống, vì vậy cần có một truy vấn như trên để xem định nghĩa của nó. Các giá trị này không rõ ràng khi xem định nghĩa bảng. Và, vì kiểu ENUM thực sự là một kiểu dữ liệu tách biệt với kiểu dữ liệu NUMERIC và TEXT được tích hợp sẵn, các toán tử và hàm số và chuỗi thông thường không hoạt động trên nó. Vì vậy, người ta không thể thực hiện một truy vấn như
SELECT FROM t WHERE color LIKE 'bl%';
-
Kiểm tra các ràng buộc
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
Hai lợi thế là, một, "những gì bạn thấy là những gì bạn nhận được", nghĩa là, các giá trị hợp lệ cho cột được ghi lại ngay trong định nghĩa bảng và hai, tất cả các toán tử chuỗi hoặc số gốc đều hoạt động.
-
Khóa ngoại
CREATE TABLE valid_colors ( id SERIAL PRIMARY KEY NOT NULL, color TEXT ); INSERT INTO valid_colors (color) VALUES ('red'), ('green'), ('blue'); CREATE TABLE t ( color_id INTEGER REFERENCES valid_colors (id) );
Về cơ bản giống như tạo kiểu ENUM, ngoại trừ, các toán tử chuỗi hoặc số gốc hoạt động và người ta không phải truy vấn danh mục hệ thống để khám phá các giá trị hợp lệ. Cần có sự tham gia để liên kết
color_id
thành giá trị văn bản mong muốn.