外鍵 是關聯式資料庫維護參考完整性的核心機制。本文以標準 EMPLOYEES/DEPARTMENTS 範例,說明外鍵定義語法、父子表角色、以及 ON DELETE CASCADE 與 ON DELETE SET NULL 兩種級聯行為的差異與適用場景。
CREATE TABLE employees (
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE (email)
);
| 子句 | 角色 | 說明 |
|---|---|---|
FOREIGN KEY (department_id) | 子表欄位 | 指定「子表」中作為外鍵的欄位 (此處為 employees.department_id) |
REFERENCES departments(department_id) | 父表欄位 | 指定「父表」及其被參考的主鍵/唯一鍵欄位 (departments.department_id) |
口訣:子表持有外鍵,指向父表的主鍵。資料流向:父表先有資料,子表才能引用。
當父表記錄被刪除時,子表對應記錄如何處理?
| 選項 | 行為 | 適用場景 | 風險提示 |
|---|---|---|---|
| 無指定 (預設) | 禁止刪除父表記錄,若子表有引用則報錯 ORA-02292 | 嚴格參考完整性、核心主檔 (如部門、客戶主檔) | 需先手動清理子表資料才能刪父表 |
ON DELETE CASCADE | 自動刪除子表中所有引用該父鍵的記錄 | 明確從屬關係、臨時/明細表 (如訂單明細、日誌明細) | 極度危險:一刪除可能連鎖刪除大量資料,且不觸發子表觸發器 |
ON DELETE SET NULL | 將子表對應外鍵欄位設為 NULL | 外鍵欄位允許 NULL、關係可暫時斷開 (如員工調離部門暫無歸屬) | 外鍵欄位必須未設 NOT NULL;可能導致孤兒資料 |
CONSTRAINT ... DEFERRABLE INITIALLY DEFERRED 允許交易中暫時違反外鍵,提交時再檢查,適用複雜批次異動。ALTER TABLE employees ENABLE/DISABLE CONSTRAINT emp_dept_fk; 大量載入資料時可暫停約束提升速度,載入後重新啟用並驗證 (ENABLE VALIDATE)。CASCADE,但必須有完整備份與審計追蹤。IDX_子表名_外鍵欄位。