首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

快速掌握 DB2 資料庫建立外鍵時的選項與行為

     編輯:DB2 教學

在 DB2 中建立外鍵約束時,ON DELETE 與 ON UPDATE 子句決定了父表記錄異動時,子表關聯記錄的連鎖行為。本文透過完整範例快速說明各選項語意與實際效果。

建立測試環境

DROP TABLE student_class;
DROP TABLE student;
DROP TABLE class;

CREATE TABLE student (
  student_id INTEGER NOT NULL,
  student_name VARCHAR(200),
  CONSTRAINT pk_student PRIMARY KEY (student_id)
) IN luzl_32k_tb INDEX IN luzl_32k_tb;

CREATE TABLE class (
  class_id INTEGER NOT NULL,
  class_name VARCHAR(200),
  CONSTRAINT pk_class PRIMARY KEY (class_id)
) IN luzl_32k_tb INDEX IN luzl_32k_tb;

CREATE TABLE student_class (
  student_class_id INTEGER,
  student_id INTEGER,
  class_id INTEGER
) IN luzl_32k_tb INDEX IN luzl_32k_tb;

ALTER TABLE student_class
  ADD CONSTRAINT fk_class FOREIGN KEY (class_id)
  REFERENCES class(class_id)
  ON DELETE CASCADE ON UPDATE RESTRICT;

ALTER TABLE student_class
  ADD CONSTRAINT fk_student FOREIGN KEY (student_id)
  REFERENCES student(student_id)
  ON DELETE CASCADE ON UPDATE RESTRICT;

INSERT INTO student VALUES (1, 'luzl');
INSERT INTO class VALUES (1, 'db2');
INSERT INTO student_class VALUES (1, 1, 1);

ON DELETE 選項詳解

注意: RESTRICT 與 NO ACTION 在刪除語境下行為一致;CASCADE 為遞歸級聯(子表若也是他表父表將繼續傳播)。

ON UPDATE 選項

DB2 僅支援兩種選項,且行為與刪除時相同:

  • RESTRICT / NO ACTION:若存在相依子記錄,禁止更新父表鍵值

不支援 CASCADE 或 SET NULL 於更新操作。

關鍵前提條件

父表關聯欄位必須為主鍵(或唯一約束),才能被子表外鍵引用。此為關聯完整性的基礎要求。

實務建議

  • 依業務語義選擇:訂單-明細常用 CASCADE;主檔-參考檔常用 RESTRICT
  • SET NULL 需確保子表欄位允許 NULL,且應用程式能正確處理空值
  • 大量資料操作時,CASCADE 可能產生大量遞歸刪除,需評估效能與鎖衝突
  • 定期檢查系統目錄 SYSCAT.REFERENCES 確認外鍵定義與預期一致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
選項行為說明
RESTRICT / NO ACTION阻擋刪除若存在相依子記錄,拋錯誤禁止刪除父記錄
CASCADE級聯刪除刪除父記錄時,自動刪除所有相依子記錄
SET NULL設為空值允許刪除父記錄,並將子表關聯欄位設為 NULL(前提:欄位允許 NULL)