Các ràng buộc cơ bản trong MySQL và cách áp dụng hiệu quả

Ràng buộc (Constraints) trong MySQL là các quy tắc được định nghĩa trên cột hoặc tập hợp cột nhằm đảm bảo tính toàn vẹn, nhất quán và độ tin cậy của dữ liệu. Khi một thao tác vi phạm ràng buộc, truy vấn sẽ bị từ chối và ném lỗi.

1. Ràng buộc khóa chính (PRIMARY KEY)

Mỗi bảng chỉ được phép có một và duy nhất một ràng buộc khóa chính, đảm bảo giá trị trong cột (hoặc nhóm cột) là duy nhấtkhông NULL. Khóa chính thường nên là giá trị vô danh — ví dụ: số nguyên tự tăng (AUTO_INCREMENT) — thay vì gắn với logic nghiệp vụ như CMND hay mã thẻ ngân hàng, vì điều này làm giảm khả năng mở rộng và gây rủi ro khi nghiệp vụ thay đổi.

Ví dụ 1: Khai báo khóa chính ngay khi tạo bảng:

USE students;
CREATE TABLE learners (
    id INT NOT NULL AUTO_INCREMENT,
    full_name VARCHAR(64),
    region VARCHAR(40),
    PRIMARY KEY (id)
);

Ví dụ 2: Khóa chính ghép từ hai cột:

CREATE TABLE learners (
    id INT NOT NULL,
    full_name VARCHAR(64) NOT NULL,
    region VARCHAR(40),
    CONSTRAINT pk_learner_identity PRIMARY KEY (id, full_name)
);

Ví dụ 3: Thêm khóa chính sau khi bảng đã tồn tại:

ALTER TABLE learners ADD PRIMARY KEY (id);

Ví dụ 4: Xóa khóa chính hiện có trước khi thiết lập lại:

ALTER TABLE learners DROP PRIMARY KEY;

Lưu ý: Nếu cột có thuộc tính AUTO_INCREMENT, cần loại bỏ nó trước khi xóa khóa chính: MODIFY id INT.

2. Ràng buộc NOT NULL

Yêu cầu giá trị của cột không được để trống trong mọi bản ghi mới hoặc cập nhật.

ALTER TABLE learners MODIFY COLUMN region VARCHAR(40) NOT NULL;

Để gỡ bỏ ràng buộc này:

ALTER TABLE learners MODIFY COLUMN region VARCHAR(40) NULL;

3. Ràng buộc UNIQUE

Đảm bảo giá trị trong cột hoặc tổ hợp cột không trùng lặp. Khác với khóa chính, UNIQUE cho phép tồn tại nhiều giá trị NULL và có thể áp dụng cho nhiều cột trong cùng một bảng.

ALTER TABLE learners ADD COLUMN email VARCHAR(100) UNIQUE;

Ví dụ kết hợp: Đặt ràng buộc duy nhất trên hai cột đồng thời:

CREATE TABLE learners (
    id INT PRIMARY KEY,
    full_name VARCHAR(64),
    email VARCHAR(100),
    national_id CHAR(12),
    CONSTRAINT uq_email_nid UNIQUE (email, national_id)
);

4. Ràng buộc khóa ngoại (FOREIGN KEY)

Thiết lập mối quan hệ giữa hai bảng: bảng cha (chứa khóa chính) và bảng con (chứa khóa ngoại). Giá trị khóa ngoại phải khớp với giá trị khóa chính tương ứng trong bảng cha — trừ khi là NULL.

Giả sử ta có hai bảng:

-- Bảng môn học
CREATE TABLE subjects (
    code CHAR(6) PRIMARY KEY,
    title VARCHAR(80),
    credits TINYINT DEFAULT 3
);

-- Bảng sinh viên
CREATE TABLE students (
    roll_no CHAR(10) PRIMARY KEY,
    name VARCHAR(64),
    enrolled_year YEAR
);

-- Bảng đăng ký môn
CREATE TABLE registrations (
    reg_id INT PRIMARY KEY AUTO_INCREMENT,
    student_id CHAR(10),
    subject_code CHAR(6),
    semester TINYINT,
    CONSTRAINT fk_student FOREIGN KEY (student_id) 
        REFERENCES students(roll_no) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_subject FOREIGN KEY (subject_code) 
        REFERENCES subjects(code) ON DELETE RESTRICT ON UPDATE CASCADE
);

Các tùy chọn hành vi khi cập nhật/xóa bảng cha:

  • ON DELETE CASCADE: Xóa bản ghi con khi bản ghi cha bị xóa.
  • ON DELETE RESTRICT: Từ chối xóa nếu còn bản ghi con liên quan.
  • ON UPDATE CASCADE: Tự động cập nhật giá trị khóa ngoại khi khóa chính cha thay đổi.

5. Ràng buộc giá trị mặc định (DEFAULT)

Xác định giá trị được chèn tự động khi không cung cấp dữ liệu cho cột đó.

-- Khi tạo bảng
CREATE TABLE logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    action VARCHAR(50),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Hoặc thêm sau:
ALTER TABLE logs ALTER COLUMN created_at SET DEFAULT CURRENT_TIMESTAMP;

Loại bỏ giá trị mặc định:

ALTER TABLE logs ALTER COLUMN created_at DROP DEFAULT;

6. Kiểm tra ràng buộc hiện tại

Sử dụng lệnh sau để xem cấu trúc bảng kèm toàn bộ ràng buộc đã khai báo:

SHOW CREATE TABLE registrations;

Lưu ý thứ tự thao tác:
– Khi xóa dữ liệu: luôn xóa bảng con trước, rồi đến bảng cha.
– Khi chèn dữ liệu: chèn bảng cha trước, sau đó mới chèn bảng con.
– Khi tạo/xóa bảng: tuân thủ thứ tự phụ thuộc (bảng cha trước, bảng con sau).

Thẻ: mysql sql-constraints foreign-key primary-key unique-constraint

Đăng vào ngày 11 tháng 9 lúc 08:56