InnoDB 支持外鍵約束與級聯動作。本文以新聞-分類-評論三表為例,演示級聯刪除/更新的完整 DDL 與驗證。
CREATE DATABASE yynews; USE yynews;
CREATE TABLE categories(
catId INT AUTO_INCREMENT PRIMARY KEY,
catName VARCHAR(40) NOT NULL UNIQUE
) CHARSET=utf8;
CREATE TABLE news(
newsId INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL UNIQUE,
content TEXT NOT NULL,
createTime TIMESTAMP NOT NULL,
catId INT
) CHARSET=utf8;
CREATE TABLE comments(
commId INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
createTime TIMESTAMP NOT NULL,
newsId INT NOT NULL,
userIP CHAR(15) NOT NULL
) CHARSET=utf8;
ALTER TABLE news ADD CONSTRAINT fk_news_cat FOREIGN KEY (catId) REFERENCES categories(catId) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE comments ADD CONSTRAINT fk_comment_news FOREIGN KEY (newsId) REFERENCES news(newsId) ON DELETE CASCADE ON UPDATE CASCADE;
INSERT INTO categories(catName) VALUES('娛樂新聞'),('國際新聞');
INSERT INTO news(title,content,createTime,catId) VALUES
('test1','test1',NOW(),1),('test2','test2',NOW(),2),('test3','test3',NOW(),1);
INSERT INTO comments(content,createTime,newsId,userIP) VALUES
('you',NOW(),1,'127.0.0.1'),('you',NOW(),2,'127.0.0.1'),
('you',NOW(),3,'127.0.0.1'),('you',NOW(),1,'127.0.0.1');
DELETE FROM categories WHERE catId = 1;
結果:分類 1 被刪 → 關聯 news (test1,test3) 刪除 → 關聯 comments (4 條) 全部刪除,僅剩分類 2 及其新聞和評論。
| 選項 | 父表操作 | 子表行為 |
|---|---|---|
| RESTRICT / NO ACTION | 刪除/更新 | 阻止,報錯 1451 |
| CASCADE | 刪除/更新 | 同步刪除/更新關聯行 |
| SET NULL | 刪除/更新 | 外鍵列置 NULL(需列允許 NULL) |
| SET DEFAULT | 刪除/更新 | 外鍵列置默認值(MySQL 暫不支持) |
deleted_at)。ON UPDATE CASCADE(主鍵極少變),ON DELETE RESTRICT 強制應用層處理刪除邏輯。