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