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

深入理解 MySQL 外鍵約束與引用完整性

     編輯:MySQL 資料庫相關知識

什麼是外鍵?

外鍵是關聯式資料庫中維護引用完整性的核心機制。它允許將一個資料表的欄位(或欄位組合)與另一個資料表的主鍵或唯一鍵建立關聯,確保跨表的資料一致性。當您在子表中插入或更新資料時,資料庫會自動檢查父表中是否存在對應的鍵值;若不存在則拒絕操作,從而防止產生「孤兒資料」。

MySQL 中的外鍵支援

MySQL 的外鍵功能由 InnoDB 儲存引擎 提供。其他引擎(如 MyISAM)雖然接受外鍵語法,但不會實際強制執行約束。因此,若需使用外鍵,請務必在建表時指定 ENGINE=InnoDB(MySQL 5.5+ 已為預設)。

核心語法與範例

以下範例建立一個父表 parent 及子表 child,並示範 ON DELETE CASCADE 級聯刪除:

CREATE TABLE parent (
    par_id INT NOT NULL,
    PRIMARY KEY (par_id)
) ENGINE=InnoDB;

CREATE TABLE child (
    par_id INT NOT NULL,
    child_id INT NOT NULL,
    PRIMARY KEY (par_id, child_id),
    FOREIGN KEY (par_id) REFERENCES parent(par_id) ON DELETE CASCADE
) ENGINE=InnoDB;

關鍵點解析

  • REFERENCES parent(par_id):指定參照的父表欄位,必須為主鍵或唯一索引。
  • ON DELETE CASCADE:當父表記錄被刪除時,自動刪除子表中所有關聯記錄。其他常見選項還有 SET NULL、RESTRICT(預設)、NO ACTION。
  • 複合主鍵:子表採用 (par_id, child_id) 作為主鍵,確保同一父記錄下的子記錄唯一。

進階應用:自我參照

外鍵也可指向同一資料表,稱為自我參照。典型場景包括員工-主管關係、分類樹狀結構等。範例:

CREATE TABLE category (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES category(id) ON DELETE SET NULL
) ENGINE=InnoDB;

最佳實踐建議

  1. 必須為 InnoDB 表,並確保參照欄位有索引(InnoDB 會自動為外鍵欄位建立索引)。
  2. 資料類型完全一致:父表與子表的關聯欄位類型、長度、簽名(UNSIGNED)必須完全相同。
  3. 謹慎使用 CASCADE:級聯操作可能觸發大量連鎖刪除/更新,影響效能;建議在業務邏輯層明確處理關聯資料。
  4. 避免循環參照:多表之間的外鍵關係不應形成循環,否則會導致插入/刪除死鎖。

常見錯誤排查

  • ERROR 1215 (HY000): Cannot add foreign key constraint:通常因欄位類型不符、父表缺少索引、或引擎非 InnoDB。
  • ERROR 1452 (23000): Cannot add or update a child row:嘗試插入父表不存在的鍵值。

善用外鍵約束,能讓資料庫自動守護資料一致性,減少應用層的防禦性程式碼,是建構健壯資料模型的關鍵一環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved