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

DB2 外鍵約束 ON DELETE/UPDATE 選項完整指南

     編輯:DB2 教學

建立測試環境

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

CREATE TABLE student (
    student_id INTEGER NOT NULL,
    student_name VARCHAR(200),
    CONSTRAINT P_KEY_1 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 P_KEY_2 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 if_class
    FOREIGN KEY (class_id) REFERENCES class(class_id)
    ON DELETE CASCADE ON UPDATE RESTRICT;

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

ON DELETE 四大選項行為對照

選項父記錄被刪除時子記錄結果典型用途
RESTRICT / NO ACTION 檢查子表是否存在關聯記錄 若有關聯則報錯,阻止刪除 嚴格保護參考完整性,防止誤刪
CASCADE 自動遞刪關聯的子記錄 子記錄連同刪除(級聯刪除) 主從關係緊密,如訂單-明細
SET NULL 允許刪除父記錄 子表外鍵欄位設為 NULL 外鍵欄位允許 NULL,需保留子記錄

ON UPDATE 僅支援兩種選項

  • RESTRICT:父鍵值被引用時禁止修改
  • NO ACTION:語意同 RESTRICT,執行時機略有不同(標準 SQL 行為)
DB2 不支援 ON UPDATE CASCADE 或 SET NULL,若需級聯更新需透過觸發器或應用層實現。

關鍵前提條件

父表欄位必須定義為 PRIMARY KEY 或 UNIQUE NOT NULL,才能被子表外鍵引用。測試腳本中已於 student、class 表建立主鍵約束。

測試資料驗證

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

-- 測試 CASCADE:刪除 class(1) → student_class 關聯行自動刪除
DELETE FROM class WHERE class_id = 1;

外鍵測試結果

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved