首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 外鍵約束深度解析:語法、引用動作、創建刪除與實戰陷阱

     編輯:MySQL 資料庫相關知識

外鍵啟用三大硬性條件

  1. 父子表均為 InnoDB(MyISAM 不支持)。
  2. 外鍵列必須建立索引(5.1.2+ 自動創建,舊版手動建)。
  3. 引用列數據類型兼容(數值系互通,數值與字符串不通)。

外鍵核心價值

  • 強制關聯完整性:防止孤兒數據(子表引用不存在的父鍵)。
  • 級聯操作自動化:父表變更自動傳播至子表,減少應用層邏輯。

完整定義語法

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
  • 可用於 CREATE TABLE 或 ALTER TABLE。
  • 未指定 CONSTRAINT symbol 時 MySQL 自動生成名稱。

五種引用動作語義對比

動作父表 DELETE/UPDATE 時子表行為InnoDB 支持
CASCADE子表同步刪除/更新匹配行✅
SET NULL子表外鍵列置 NULL(列需允許 NULL)✅
NO ACTION拒絕父表操作(標準 SQL 延遲檢查)✅
RESTRICT拒絕父表操作(立即檢查,默認行為)✅
SET DEFAULT子表外鍵列置默認值❌ 不支持

注意:未指定 ON DELETE/UPDATE 時默認 RESTRICT。

兩大高頻業務模式

  1. 保護歷史數據:ON UPDATE CASCADE ON DELETE RESTRICT(父改子跟隨,父刪有子則攔截)。
  2. 生命週期綁定:ON UPDATE CASCADE ON DELETE CASCADE(父刪子隨之消失)。

動態管理外鍵

添加外鍵

ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE ...] [ON UPDATE ...];

刪除外鍵

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

提示:fk_symbol 為約束名稱(可通過 SHOW CREATE TABLE 查看),而非索引名或列名。

常見陷阱避坑

  • 大表加外鍵會鎖表檢查現有數據,建議低峰期或使用 pt-online-schema-change。
  • 外鍵會增加 INSERT/UPDATE 開銷(需查詢父表),高寫入場景需權衡。
  • 避免循環外鍵引用(A→B→A),極難維護且易死鎖。
  • 字符集/校對規則不一致會導致創建失敗(ERROR 1005),父子表需保持一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved