建立父表與子表
-- 父表
CREATE TABLE a (
name CHAR(20) NOT NULL,
id CHAR(20) NOT NULL PRIMARY KEY
);
-- 子表:外鍵關聯 a.id,級聯刪除
CREATE TABLE b (
b_name CHAR(20) NOT NULL,
b_id CHAR(20) NOT NULL,
CONSTRAINT fk_b_a FOREIGN KEY (b_id) REFERENCES a(id) ON DELETE CASCADE
);
插入資料驗證
INSERT INTO a VALUES ('111', '1'), ('222', '2');
-- 成功:b_id=1 存在於 a.id
INSERT INTO b VALUES ('child1', '1');
-- 失敗:b_id=3 不存在於 a.id,外鍵約束攔截
INSERT INTO b VALUES ('child2', '3');
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
級聯刪除驗證
DELETE FROM a WHERE id = '1';
-- 子表 b 中 b_id='1' 的行自動被刪除
其他級聯選項
| 選項 | 父表刪除/更新時子表行為 |
| ON DELETE CASCADE | 自動刪除關聯子行 |
| ON DELETE SET NULL | 子表外鍵欄位設為 NULL(需允許 NULL) |
| ON DELETE RESTRICT | 禁止刪除(預設),拋錯 |
| ON DELETE NO ACTION | 同 RESTRICT,標準 SQL 語法 |
| ON UPDATE CASCADE | 父表主鍵更新時,子表外鍵同步更新 |
使用建議
- 外鍵保證資料完整性,但會增加寫入開銷、鎖競爭
- 高併發核心業務常在應用層維護完整性,資料庫層不建外鍵
- 若使用外鍵,**務必建立索引**於子表外鍵欄位(
INDEX idx_b_id (b_id)),否則刪除父行需全表掃描子表
- 級聯刪除可能引發連鎖反應,謹慎評估業務影響
- 上一篇文章: 專案選型:為什麼我用 MongoDB 取代 MySQL
- 下一篇文章: SQL 修改字段內容:使用 REPLACE 函數批量替換數據
Copyright ©
程式碼之家 All Rights Reserved