Các ràng buộc toàn vẹn trong bảng MySQL
Trong hệ quản trị cơ sở dữ liệu quan hệ như MySQL, các ràng buộc toàn vẹn (integrity constraints) là những quy tắc được áp dụng trên cột hoặc tập hợp cột nhằm đảm bảo tính chính xác, nhất quán và độ tin cậy của dữ liệu. Chúng hoạt động tự động khi thực hiện các thao tác INSERT, UPDATE, hoặc DELETE, từ đó ngăn chặn việc chèn hoặc sửa đổi dữ liệu vi phạm logic nghiệp vụ.
Ràng buộc NOT NULL
Yêu cầu giá trị của cột không được phép là NULL. Nếu không kích hoạt chế độ nghiêm ngặt (strict mode), MySQL có thể tự động chuyển đổi giá trị rỗng thành giá trị mặc định — điều này làm suy yếu hiệu lực của ràng buộc.
CREATE TABLE users (
user_id INT NOT NULL,
username VARCHAR(50) NOT NULL
);
Ràng buộc DEFAULT
Xác định giá trị mặc định sẽ được sử dụng khi không cung cấp dữ liệu cho cột trong câu lệnh INSERT. Ràng buộc này thường kết hợp với NOT NULL để đảm bảo tính đầy đủ.
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
status ENUM('pending', 'shipped', 'delivered') DEFAULT 'pending',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Ràng buộc UNIQUE
Đảm bảo tất cả giá trị trong cột (hoặc tổ hợp cột) là duy nhất. Không cho phép trùng lặp, nhưng vẫn chấp nhận nhiều giá trị NULL (trừ khi kết hợp với NOT NULL).
-- Duy nhất trên một cột
CREATE TABLE emails (
id INT PRIMARY KEY,
address VARCHAR(100) UNIQUE
);
-- Duy nhất trên tổ hợp cột
CREATE TABLE access_logs (
id INT PRIMARY KEY,
ip_address VARCHAR(45),
endpoint VARCHAR(128),
UNIQUE(ip_address, endpoint)
);
Ràng buộc AUTO_INCREMENT
Chỉ áp dụng cho kiểu số nguyên, tự động tăng giá trị mỗi khi chèn bản ghi mới. Cột phải được khai báo NOT NULL và thường đi kèm với UNIQUE hoặc PRIMARY KEY.
CREATE TABLE products (
prod_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2)
);
Ràng buộc PRIMARY KEY
Là sự kết hợp của NOT NULL và UNIQUE, dùng để định danh duy nhất mỗi hàng trong bảng. Mỗi bảng chỉ được phép có **một** khóa chính, có thể gồm một hoặc nhiều cột (gọi là khóa phức hợp).
-- Khóa chính đơn cột
CREATE TABLE categories (
cat_id INT PRIMARY KEY,
title VARCHAR(64) NOT NULL
);
-- Khóa chính phức hợp
CREATE TABLE user_roles (
user_id INT NOT NULL,
role_id INT NOT NULL,
assigned_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, role_id)
);
Ràng buộc FOREIGN KEY
Thiết lập mối quan hệ giữa hai bảng, đảm bảo giá trị trong cột con (child column) phải tồn tại trong cột cha (parent column). Yêu cầu bắt buộc:
- Cả hai bảng đều sử dụng engine
InnoDB; - Cột tham chiếu (trong bảng cha) phải có ràng buộc
UNIQUEhoặc làPRIMARY KEY; - Kiểu dữ liệu và độ dài phải tương thích;
- Không được khai báo
NOT NULLnếu muốn hỗ trợ hành viSET NULL.
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(64) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
full_name VARCHAR(128) NOT NULL,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
Hành vi liên kết (Referential Actions)
Khi cấu hình khóa ngoại, có thể chỉ định cách xử lý khi cập nhật hoặc xóa bản ghi cha:
ON DELETE CASCADE: Xóa tự động các bản ghi con khi xóa bản ghi cha;ON UPDATE CASCADE: Cập nhật giá trị khóa ngoại trong bản ghi con khi thay đổi khóa chính ở bảng cha;ON DELETE SET NULL: Đặt giá trị khóa ngoại thànhNULLnếu cột cho phépNULL;ON DELETE RESTRICT: Từ chối thao tác nếu còn bản ghi con phụ thuộc (mặc định).
Ràng buộc UNSIGNED
Áp dụng cho kiểu số nguyên, loại bỏ phần âm của miền giá trị — ví dụ: TINYINT thông thường có miền từ -128 đến 127, trong khi TINYINT UNSIGNED mở rộng sang 0 đến 255. Lưu ý: UNSIGNED không áp dụng cho kiểu dấu phẩy động như FLOAT hoặc DOUBLE.
CREATE TABLE metrics (
metric_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT UNSIGNED NOT NULL,
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);