在 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);
| 選項 | 行為 | 說明 |
|---|---|---|
RESTRICT / NO ACTION | 阻擋刪除 | 若存在相依子記錄,拋錯誤禁止刪除父記錄 |
CASCADE | 級聯刪除 | 刪除父記錄時,自動刪除所有相依子記錄 |
SET NULL | 設為空值 | 允許刪除父記錄,並將子表關聯欄位設為 NULL(前提:欄位允許 NULL) |