Constraint (ràng buộc) là các quy tắc được database thực thi trên dữ liệu trong các bảng — đảm bảo tính toàn vẹn dữ liệu ở cấp database (không chỉ trong code ứng dụng). Các loại chính: PRIMARY KEY, FOREIGN KEY, UNIQUE, , và .
Constraint (ràng buộc) là các quy tắc được database thực thi trên dữ liệu trong các bảng — đảm bảo tính toàn vẹn dữ liệu ở cấp database (không chỉ trong code ứng dụng). Các loại chính: PRIMARY KEY, FOREIGN KEY, UNIQUE, , và .
NOT NULLCHECKDEFAULTCREATE TABLE users (
id INT PRIMARY KEY, -- định danh duy nhất + không null
email VARCHAR(255) UNIQUE NOT NULL, -- phải duy nhất VÀ có giá trị
age INT CHECK (age >= 0 AND age <= 120), -- phải thỏa một điều kiện
country VARCHAR(2) DEFAULT 'US', -- giá trị mặc định nếu không cung cấp
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (toàn vẹn tham chiếu)
);
PRIMARY KEY → xác định duy nhất một dòng (duy nhất + không null, có index)
FOREIGN KEY → tham chiếu key của bảng khác (toàn vẹn tham chiếu)
UNIQUE → không cho phép giá trị trùng lặp trong cột này
NOT NULL → cột phải có giá trị (không thể là NULL)
CHECK → giá trị phải thỏa một điều kiện (age >= 0, status IN (...))
DEFAULT → giá trị được dùng khi không cung cấp lúc insert
-- ❌ chỉ dựa vào code ứng dụng để đảm bảo tính duy nhất:
-- một race condition, một bug, hoặc một app khác có thể chèn bản trùng
-- ✅ một constraint UNIQUE đảm bảo điều đó ở cấp DB — LUÔN được thực thi,
-- bất kể code nào hay bao nhiêu app truy cập database
email VARCHAR(255) UNIQUE
Constraint của database là tuyến phòng thủ cuối cùng cho toàn vẹn dữ liệu — chúng được thực thi bất kể code nào chèn dữ liệu (nhiều ứng dụng, script, thao tác thủ công, hay code có bug), và chúng xử lý các race condition mà kiểm tra ở cấp ứng dụng bỏ lỡ.
CHECK (price > 0) -- giá phải dương
CHECK (status IN ('active', 'inactive')) -- chỉ các trạng thái hợp lệ
CHECK (end_date > start_date) -- nhất quán logic
CHECK thực thi quy tắc nghiệp vụ/miền trực tiếp trong schema.
Constraint thiết yếu để duy trì toàn vẹn dữ liệu — chúng đảm bảo dữ liệu trong database thỏa các quy tắc (duy nhất, có giá trị, giá trị hợp lệ, tham chiếu hợp lệ) ở cấp database, điều nền tảng cho ứng dụng đáng tin cậy, nên hiểu chúng là quan trọng.
Biết các loại constraint (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT) và mỗi loại thực thi gì là cần thiết cho thiết kế schema đúng.
Điểm khái niệm quan trọng nhất là tại sao thực thi ở cấp database thay vì chỉ trong code ứng dụng: constraint của database là tuyến phòng thủ cuối cùng cho toàn vẹn dữ liệu — chúng luôn được thực thi bất kể code nào hay bao nhiêu ứng dụng truy cập dữ liệu, chúng bắt được các bug mà kiểm tra ở app có thể bỏ lỡ, và quan trọng là chúng xử lý các race condition mà validation ở cấp ứng dụng không thể (vd hai lần chèn đồng thời đều vượt qua kiểm tra tính duy nhất ở cấp app nhưng một constraint UNIQUE từ chối đúng bản trùng).
Chỉ dựa vào code ứng dụng cho toàn vẹn là rủi ro; constraint cung cấp một đảm bảo.
Hiểu CHECK constraint để thực thi quy tắc nghiệp vụ/miền (khoảng giá trị hợp lệ, các giá trị được phép, nhất quán logic) trực tiếp trong schema cũng giá trị.
Vì toàn vẹn dữ liệu là then chốt cho ứng dụng đáng tin cậy, và vì constraint cung cấp các đảm bảo ở cấp database bảo vệ chống lại bug, race condition và dữ liệu không nhất quán theo cách mà chỉ code ứng dụng không thể, hiểu constraint — các loại, các đảm bảo toàn vẹn của chúng và tầm quan trọng của việc thực thi ở cấp database — là kiến thức quan trọng, nền tảng để thiết kế database vững chắc và là một khía cạnh then chốt của việc xây ứng dụng có dữ liệu luôn nhất quán và hợp lệ.