Referential Integrity Rule (Quy tắc toàn vẹn tham chiếu) đảm bảo tính nhất quán giữa các bảng thông qua mối quan hệ **Foreign Key (FK) → Primary Key (PK)**. Nội dung cốt lõi: Giá trị FK phải khớp với giá trị PK tồn tại trong bảng tham chiếu, hoặc là NULL.
Nguyên tắc cơ bản
- FK tham chiếu đến PK (hoặc Unique Key) của bảng khác.
- Giá trị FK **phải tồn tại** trong tập giá trị PK của bảng tham chiếu (parent table).
- FK **có thể là NULL** (nếu quan hệ tùy chọn/optional) - nghĩa là entity con chưa liên kết với entity cha.
- PK và FK **phải cùng kiểu dữ liệu** (hoặc tương thích ngầm) để join được.
Ví dụ minh họa
Bảng Employee (Con - Child)
| EMP_ID (PK) | EMP_NAME | DEPT_ID (FK) |
|---|---|---|
| E001 | An | D01 |
| E002 | Bình | D02 |
| E003 | Cường | NULL |
Bảng Department (Cha - Parent)
| DEPT_ID (PK) | DEPT_NAME | DEPT_ZONE |
|---|---|---|
| D01 | IT | Hà Nội |
| D02 | HR | TP.HCM |
Phân tích:
DEPT_IDtrong Employee là FK tham chiếuDEPT_IDtrong Department.- E001 (D01) ✓, E002 (D02) ✓ - Khớp PK tồn tại.
- E003 (NULL) ✓ - Cho phép NULL (nhân viên chưa phân phòng).
- Nếu insert E004 với DEPT_ID = 'D99' (không có trong Department) -> **VI PHẠM** Referential Integrity -> DB từ chối.
Referential Actions (Hành động tham chiếu) - ON DELETE / ON UPDATE
Khi record cha (PK) bị xóa hoặc sửa, DB phải quyết định xử lý record con (FK) như thế nào:
| Action | Mô tả | Khi nào dùng |
|---|---|---|
RESTRICT / NO ACTION | Chặn xóa/sửa cha nếu còn con tham chiếu. (Mặc định hầu hết DB). | Bảo vệ dữ liệu con, bắt buộc xử lý con trước. |
CASCADE | Tự động xóa/sửa các record con khi cha bị xóa/sửa. | Con không tồn tại độc lập (OrderDetail -> Order). |
SET NULL | Set FK của con = NULL khi cha bị xóa/sửa (FK phải cho phép NULL). | Con tồn tại độc lập (Employee -> Department). |
SET DEFAULT | Set FK = giá trị DEFAULT khi cha bị xóa/sửa. | Ít dùng, cần DEFAULT value hợp lệ. |
Ví dụ định nghĩa FK với Referential Actions
CREATE TABLE Employee (
EMP_ID CHAR(4) PRIMARY KEY,
EMP_NAME VARCHAR(50) NOT NULL,
DEPT_ID CHAR(3),
FOREIGN KEY (DEPT_ID) REFERENCES Department(DEPT_ID)
ON DELETE SET NULL -- Xóa phòng ban -> NV chưa phòng
ON UPDATE CASCADE -- Sửa mã phòng -> tự cập nhật NV
);
Tầm quan trọng
- Ngăn chặn **Orphan Records** (record con mồ côi - tham chiếu PK không tồn tại).
- Đảm bảo **Data Consistency** (nhất quán dữ liệu) cross-table.
- Hỗ trợ **Join** chính xác, báo cáo đúng.
- Cơ chế bảo vệ ở mức Database (không phụ thuộc application code).
Các lỗi thường gặp
- Quên khai báo FK constraint -> dữ liệu bẩn (orphan).
- Kiểu dữ liệu FK ≠ PK (VARCHAR vs CHAR, INT vs BIGINT) -> lỗi tạo FK hoặc join chậm/sai.
- FK NOT NULL nhưng quan hệ thực tế là optional -> ép buộc gán giá trị giả.
- Sai
ON DELETEaction: Dùng CASCADE cho weak entity, SET NULL cho optional relationship. - Circular reference (A→B, B→A) -> cần deferrable constraint hoặc xử lý transaction.
Tóm lại: Referential Integrity là "dây chuyền" giữ cho dữ liệu liên quan không bị đứt gãy. FK phải trỏ đến PK thật, và hành động xóa/sửa cha phải được định nghĩa rõ ràng.