首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 外鍵約束詳解:子表、父表關係與刪除規則

     編輯:Oracle 資料庫相關知識

外鍵 是關聯式資料庫維護參考完整性的核心機制。本文以標準 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)

口訣:子表持有外鍵,指向父表的主鍵。資料流向:父表先有資料,子表才能引用。

三、刪除規則:ON DELETE 子句

當父表記錄被刪除時,子表對應記錄如何處理?

選項行為適用場景風險提示
無指定 (預設)禁止刪除父表記錄,若子表有引用則報錯 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)。

五、最佳實踐建議

  1. 核心主檔 (部門、客戶、產品) 採用 預設限制,強制應用層處理刪除邏輯。
  2. 明細表 (訂單項、交易流水) 視業務評估 CASCADE,但必須有完整備份與審計追蹤。
  3. 外鍵欄位 務必建索引,命名慣例:IDX_子表名_外鍵欄位。
  4. 文檼化每個外鍵的業務含義與刪除規則理由,納入資料字典。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved