在 MySQL 資料庫設計中,外鍵是維護資料完整性的核心機制。雖然 MyISAM 和 InnoDB 兩大存儲引擎在語法層面都支援外鍵,但只有 InnoDB 能真正強制執行約束。本文通過實戰案例,深入解析 InnoDB 下外鍵的建立、驗證與級聯操作機制。
MyISAM 僅支援外鍵語法解析,實際執行時會忽略約束;InnoDB 則在存儲引擎層面實現了 ACID 特性,能確保父子表數據的一致性。生產環境中涉及關聯業務的表,強制要求使用 InnoDB。
以下示例建立 parent(主表)與 child(從表)的一對多關聯,並啟用 ON DELETE CASCADE 級聯刪除:
-- 建立主表
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
-- 建立從表,關聯 parent.id
CREATE TABLE child (
id INT,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=InnoDB;
向 parent 插入基礎數據:
INSERT INTO parent VALUES (1), (2), (3);
嘗試向 child 插入不存在的 parent_id=4:
INSERT INTO child VALUES (1,1), (1,2), (1,3), (1,4);
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
系統精準攔截了非法關聯,僅允許插入前三條有效記錄。
刪除主表記錄 id=1 時,從表對應行自動清理:
DELETE FROM parent WHERE id=1;
SELECT * FROM child;
-- 結果:parent_id=1 的行已消失,剩餘 parent_id=2,3
嘗試將 child.parent_id 更新為不存在的值同樣會被阻擋:
UPDATE child SET parent_id=4 WHERE parent_id=2;
-- ERROR 1452 (23000): Foreign key constraint fails
CASCADE 可能引發連鎖刪除,核心業務表建議改用 RESTRICT 或應用層軟刪除掌握外鍵機制,能從資料庫層面構建堅固的數據完整性防線,是後端開發進階的必修課。