PostgreSQL thực thi tính toàn vẹn dữ liệu thông qua các — các quy tắc trên dữ liệu của bảng. Ngoài các constraint chuẩn (, , , , , ), Postgres còn bổ sung các tùy chọn mạnh mẽ như constraint và các biểu thức linh hoạt.
PostgreSQL thực thi tính toàn vẹn dữ liệu thông qua các — các quy tắc trên dữ liệu của bảng. Ngoài các constraint chuẩn (, , , , , ), Postgres còn bổ sung các tùy chọn mạnh mẽ như constraint và các biểu thức linh hoạt.
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- định danh duy nhất
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (toàn vẹn tham chiếu)
email VARCHAR(255) UNIQUE NOT NULL, -- duy nhất + bắt buộc
guests INT CHECK (guests > 0 AND guests <= 10), -- ràng buộc giá trị
status TEXT DEFAULT 'pending' -- giá trị mặc định
);
PRIMARY KEY → định danh dòng duy nhất
FOREIGN KEY → tham chiếu đến bảng khác (toàn vẹn tham chiếu, với các tùy chọn ON DELETE)
UNIQUE → không có giá trị trùng lặp
NOT NULL → phải có giá trị
CHECK → giá trị phải thỏa mãn một điều kiện
DEFAULT → giá trị mặc định khi không được cung cấp
CHECK (price > 0)
CHECK (end_date > start_date) -- tính nhất quán logic giữa các cột
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- kiểm tra bằng regex
Các CHECK constraint của Postgres có thể thực thi các quy tắc nghiệp vụ phong phú, bao gồm các điều kiện xuyên cột và các pattern regex.
-- ngăn các booking GỐI NHAU cho cùng một phòng (bất khả thi nếu chỉ dùng UNIQUE!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- một khoảng thời gian
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- không có hai dòng nào mà room_id
); -- bằng nhau VÀ các khoảng thời gian GỐI NHAU
Các EXCLUDE constraint (một tính năng đặc thù của Postgres) ngăn các dòng xung đột theo một toán tử tùy chỉnh — nổi tiếng là ngăn các khoảng thời gian gối nhau (đặt trùng lịch), điều mà một UNIQUE constraint không thể làm.
-- kiểm tra constraint tại lúc COMMIT thay vì ngay lập tức (hữu ích cho tham chiếu vòng)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Các constraint là thiết yếu cho tính toàn vẹn dữ liệu — chúng thực thi các quy tắc dữ liệu ở cấp cơ sở dữ liệu (tuyến phòng thủ cuối cùng, luôn được thực thi bất kể mã ứng dụng), nên hiểu sự hỗ trợ constraint của PostgreSQL là quan trọng để thiết kế các cơ sở dữ liệu vững chắc.
Biết các constraint chuẩn (PRIMARY KEY, FOREIGN KEY với toàn vẹn tham chiếu, UNIQUE, NOT NULL, CHECK, DEFAULT) và mỗi loại thực thi điều gì là nền tảng của việc thiết kế schema, mang lại các đảm bảo ở cấp cơ sở dữ liệu (tính duy nhất, tham chiếu hợp lệ, giá trị bắt buộc, dữ liệu hợp lệ) bảo vệ chống lại bug, race condition, và dữ liệu không nhất quán theo những cách mà mã ứng dụng đơn thuần không thể.
Các CHECK constraint của PostgreSQL đặc biệt mạnh mẽ, thực thi các quy tắc nghiệp vụ phong phú bao gồm các điều kiện xuyên cột (tính nhất quán logic như end_date > start_date) và thậm chí cả các pattern regex — cho phép bạn mã hóa các quy tắc miền dữ liệu trực tiếp trong schema.
Đặc biệt có giá trị là constraint EXCLUDE đặc thù của Postgres, ngăn các dòng xung đột theo các toán tử tùy chỉnh — đáng chú ý nhất là ngăn các khoảng thời gian gối nhau (đặt trùng lịch cho một phòng/tài nguyên), một khả năng mạnh mẽ mà một UNIQUE constraint chuẩn không thể cung cấp và giải quyết một cách thanh lịch một vấn đề thực tế phổ biến (lập lịch, đặt chỗ) ở cấp cơ sở dữ liệu.
Hiểu các constraint — những loại chuẩn cho tính toàn vẹn, các biểu thức CHECK linh hoạt của Postgres, và EXCLUDE mạnh mẽ để ngăn xung đột — là quan trọng để thiết kế các cơ sở dữ liệu tự động thực thi tính đúng đắn.
Vì tính toàn vẹn dữ liệu là then chốt và các constraint mang lại các đảm bảo mà mã ứng dụng không thể, và vì Postgres cung cấp các tùy chọn mạnh mẽ (CHECK phong phú, EXCLUDE cho sự gối nhau) ngoài các loại cơ bản, nên hiểu sự hỗ trợ constraint của PostgreSQL là kiến thức có giá trị, liên quan thực tiễn để xây dựng các cơ sở dữ liệu vững chắc, với constraint EXCLUDE đặc biệt là một khả năng đặc trưng, hữu ích của Postgres đáng biết cho các hệ thống lập lịch/đặt chỗ.