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

MySQL 外鍵約束完整指南:原理、語法與級聯操作實戰

     編輯:MySQL 綜合教學

MySQL 外鍵約束完整指南:原理、語法與級聯操作實戰

外鍵是關系型數據庫維護參照完整性的核心機制。本文系統梳理 MySQL 外鍵的概念、使用條件、語法詳解、級聯行為及實戰案例。

一、核心概念

  1. 本質是索引:MySQL 中「鍵」即「索引」。主鍵自動建索引,外鍵列必須顯式建立索引(5.6+ 自動創建,早期版本需手動)。
  2. 關系類型:支持一對一、一對多關聯。
  3. 存儲引擎限制:僅 InnoDB 支持,MyISAM 不支持外鍵。
  4. 數據類型兼容:關聯雙方列類型必須兼容(如 INT 對 TINYINT 可,INT 對 CHAR 不可)。
  5. 核心價值:保證跨表數據一致性,支持級聯更新/刪除。

二、創建語法詳解

[CONSTRAINT symbol] FOREIGN KEY [id] (col_name, ...)
REFERENCES tbl_name (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子表外鍵列置默認值
NO ACTION標準 SQL 行為,MySQL 中等同 RESTRICT

四、完整實戰案例

1. 建表

-- 父表:倉庫表
CREATE TABLE repo_table (
    repo_id CHAR(13) NOT NULL PRIMARY KEY,
    repo_name CHAR(14) NOT NULL
) ENGINE=InnoDB;

-- 子表:業務表
CREATE TABLE busi_table (
    busi_id CHAR(13) NOT NULL PRIMARY KEY,
    busi_name CHAR(13) NOT NULL,
    repo_id CHAR(13) NOT NULL,
    FOREIGN KEY (repo_id) REFERENCES repo_table(repo_id)
) ENGINE=InnoDB;

2. 數據驗證

INSERT INTO repo_table VALUES('12','sz'), ('13','cd');  -- 成功
INSERT INTO busi_table VALUES('1003','cd','13'), ('1002','sz','12');  -- 成功
INSERT INTO busi_table VALUES('1001','gx','11');  -- 失敗:ERROR 1452 父鍵不存在

3. 添加級聯操作

ALTER TABLE busi_table
ADD CONSTRAINT fk_repo
FOREIGN KEY (repo_id) REFERENCES repo_table(repo_id)
ON DELETE CASCADE
ON UPDATE CASCADE;

現刪除父表 repo_id='12',子表關聯行自動刪除;更新父表主鍵,子表同步更新。

五、外鍵索引優化

雖然 5.6+ 自動創建,但建議顯式聲明:

CREATE TABLE busi_table (
    ...
    INDEX idx_repo_id (repo_id),
    FOREIGN KEY (repo_id) REFERENCES repo_table(repo_id)
) ENGINE=InnoDB;

六、常見坑點與建議

  • 性能影響:大批量導入時建議暫時禁用外鍵檢查 SET FOREIGN_KEY_CHECKS=0; 導入後重新啟用。
  • 死鎖風險:高併發下外鍵檢查可能加劇鎖競爭,合理設計索引、控制事務粒度。
  • 分庫分表場景:跨庫無法建外鍵,需應用層保證一致性或採用最終一致性方案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved