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

MySQL 外鍵約束完整指南:建立條件、語法詳解與級聯操作

     編輯:MySQL 資料庫相關知識

外鍵是關係型資料庫維護引用完整性的核心機制。MySQL 僅 InnoDB 引擎支援外鍵,本文系統梳理建立條件、語法選項、級聯行為與實戰注意事項。

一、建立外鍵的三大前提條件

  1. 引擎限制:父表與子表**必須均為 InnoDB**;MyISAM 不支援(8.0 仍不支援)。
  2. 索引要求:外鍵列(子表)與被引用列(父表)**必須建立索引**。MySQL 4.1.2+ 建立外鍵時自動創建索引,舊版本需手動建立。
  3. 類型兼容:兩列**資料類型必須相容**(如 INT 對應 INT/BIGINT/SMALLINT,CHAR(10) 對應 VARCHAR(10)),嚴禁 INT 對應 CHAR 等跨類別映射。

二、外鍵定義語法詳解

[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 自動生成名稱(如 tbl_name_ibfk_1)。

三、級聯動作選項對照表

選項父表刪除/更新時,子表行為適用場景
RESTRICT阻止父表操作,拋出錯誤嚴格保護歷史數據,防止誤刪(預設)
CASCADE同步刪除/更新子表關聯行訂單-明細、分類-商品等強生命週期綁定
SET NULL子表外鍵列置 NULL(需列允許 NULL)用戶-文章、客戶-訂單等弱關聯,保留子記錄
NO ACTION同 RESTRICT(標準 SQL 語義)明確語義表達
SET DEFAULT子表外鍵列置預設值(需列有 DEFAULT)極少用,MySQL 解析器識別但 InnoDB 拒絕執行

四、實戰示例

-- 父表
CREATE TABLE departments (
  dept_id INT PRIMARY KEY,
  name VARCHAR(50)
) ENGINE=InnoDB;

-- 子表,員工歸屬部門
CREATE TABLE employees (
  emp_id INT PRIMARY KEY,
  name VARCHAR(50),
  dept_id INT,
  INDEX idx_dept (dept_id),
  CONSTRAINT fk_emp_dept
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
    ON DELETE SET NULL
    ON UPDATE CASCADE
) ENGINE=InnoDB;

五、常見陷阱與最佳實踐

  • 死鎖風險:高併發下級聯操作易產生死鎖,建議 innodb_lock_wait_timeout 適當調大,應用層捕獲重試。
  • 效能開銷:每次 DML 額外檢查父表,大批量導入時建議暫時禁用外鍵檢查:SET FOREIGN_KEY_CHECKS=0; 導入後 SET FOREIGN_KEY_CHECKS=1;。
  • 備份恢復順序:mysqldump 自動處理順序;手動恢復需先導入父表再導入子表。
  • 避免過度使用:微服務架構下,跨服務引用完整性應由應用層保證,資料庫層面僅保核心強一致性場景。
  • 檢查現有外鍵:SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved