首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 外鍵約束完全指南:InnoDB 支援條件、創建語法、級聯動作、跨引擎限制

     編輯:MySQL 綜合教學

支援前提(三大鐵律)

  1. 雙表皆為 InnoDB:MyISAM 不支援外鍵(雙表皆為 MyISAM 時不報錯但不生效,極具欺騙性);
  2. 參照列必須有索引:主鍵自帶,非主鍵需顯式 INDEX(4.1.2+ 自動創建,舊版需手動);
  3. 列類型完全匹配:類型、長度、符號位(SIGNED/UNSIGNED)一致,INT 對應 INT、TINYINT 不對應 INT。

外鍵定義語法

[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 名時 MySQL 自動生成。

級聯動作詳解

動作父表刪除/更新時,子表行如何處理
RESTRICT拒絕操作,報錯(默認)
CASCADE同步刪除/更新子表匹配行
SET NULL子表外鍵列置 NULL(列必須允許 NULL)
SET DEFAULT子表外鍵列置默認值(MySQL 解析器識別但 InnoDB 拒絕執行)
NO ACTION標準 SQL 等價 RESTRICT,檢查時機不同

創建示例

CREATE TABLE parent (
  id INT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE child (
  id INT PRIMARY KEY,
  parent_id INT,
  INDEX idx_parent (parent_id),
  CONSTRAINT fk_child_parent
    FOREIGN KEY (parent_id) REFERENCES parent(id)
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

跨引擎限制

  • 外鍵不能跨引擎:父 InnoDB + 子 MyISAM → 創建失敗;
  • 遷移引擎時需先 DROP FOREIGN KEY → ALTER ENGINE → 重建外鍵。

效能與運維提示

  • 外鍵檢查在 INSERT/UPDATE/DELETE 時額外開銷,高寫入場景可考慮應用層維護完整性,SET FOREIGN_KEY_CHECKS=0 批量導數據;
  • SHOW CREATE TABLE 查看外鍵定義;INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 查詢所有外鍵關係;
  • 死鎖風險:父子表反向操作易死鎖,保持固定加鎖順序(先父後子)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved