外鍵是關聯式資料庫中維護引用完整性的核心機制。它允許將一個資料表的欄位(或欄位組合)與另一個資料表的主鍵或唯一鍵建立關聯,確保跨表的資料一致性。當您在子表中插入或更新資料時,資料庫會自動檢查父表中是否存在對應的鍵值;若不存在則拒絕操作,從而防止產生「孤兒資料」。
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;
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;
ERROR 1215 (HY000): Cannot add foreign key constraint:通常因欄位類型不符、父表缺少索引、或引擎非 InnoDB。ERROR 1452 (23000): Cannot add or update a child row:嘗試插入父表不存在的鍵值。善用外鍵約束,能讓資料庫自動守護資料一致性,減少應用層的防禦性程式碼,是建構健壯資料模型的關鍵一環。