Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> SQL

Quy tắc toàn vẹn tham chiếu (Referential Integrity Rule) trong RDBMS


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

  1. FK tham chiếu đến PK (hoặc Unique Key) của bảng khác.
  2. Giá trị FK **phải tồn tại** trong tập giá trị PK của bảng tham chiếu (parent table).
  3. 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.
  4. 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)
E001AnD01
E002BìnhD02
E003CườngNULL

Bảng Department (Cha - Parent)

DEPT_ID (PK) DEPT_NAME DEPT_ZONE
D01ITHà Nội
D02HRTP.HCM

Phân tích:

  • DEPT_ID trong Employee là FK tham chiếu DEPT_ID trong 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:

ActionMô tảKhi nào dùng
RESTRICT / NO ACTIONChặ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.
CASCADETự độ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 NULLSet 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 DEFAULTSet 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 DELETE action: 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.