外鍵是關聯式資料庫維護參考完整性的核心機制。許多開發者僅知其用途,卻不清具體動作選項與操作指令。本文系統整理 MySQL 外鍵的建立語法、刪除方式、四種參考動作、額外參數與臨時關閉檢查技巧。
CREATE TABLE city (
...
country_id INT,
KEY idx_fk_country_id (country_id), -- 建議先建立索引
CONSTRAINT fk_city_country
FOREIGN KEY (country_id)
REFERENCES country (country_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
ON DELETE CASCADE
);
重點:
KEY idx_fk_country_id (country_id):外鍵欄位建議先加索引,若省略 MySQL 會自動補充。CONSTRAINT fk_city_country:指定外鍵名稱,便於後續管理;若省略 MySQL 會自動產生名稱。ON UPDATE CASCADE:父表主鍵更新時,子表同步更新(級聯更新)。ON DELETE CASCADE:父表記錄刪除時,子表關聯記錄同步刪除(級聯刪除)。ON DELETE RESTRICT:預設行為,子表有關聯資料時禁止刪除父表記錄。ALTER TABLE city ADD INDEX idx_city (countryid);
ALTER TABLE city ADD CONSTRAINT fk_city_country
FOREIGN KEY (countryid)
REFERENCES country (country_id)
ON DELETE CASCADE;
注意: 使用 ADD CONSTRAINT 而非 MODIFY。
ALTER TABLE tbname DROP FOREIGN KEY fk_fkname;
若建立時未指定 CONSTRAINT 名稱,可透過以下指令查詢自動產生的名稱:
SHOW CREATE TABLE tbname;
| 動作類型 | 關鍵字 | 觸發條件 | 子表行為 |
|---|---|---|---|
| 預設動作 | RESTRICT / NO ACTION | 插入子表時父表無對應主鍵 | 禁止插入 |
| RESTRICT / NO ACTION | 刪除/更新父表時子表有關聯資料 | 禁止刪除/更新 | |
| 級聯動作 | CASCADE | 更新父表主鍵 | 子表同步更新(ON UPDATE CASCADE) |
| CASCADE | 刪除父表記錄 | 子表同步刪除(ON DELETE CASCADE) | |
| 設定空值 | SET NULL | 刪除/更新父表記錄 | 子表對應外鍵欄位設為 NULL(需欄位允許 NULL) |
限制: ON DELETE RESTRICT 與 ON DELETE CASCADE 不能同時定義於同一外鍵。
適用場景:大量資料匯入順序不固定、執行 LOAD DATA 或 ALTER TABLE 時。
SET foreign_key_checks = 0; -- 關閉檢查
-- 執行匯入、結構變更等操作
SET foreign_key_checks = 1; -- 重新開啟檢查
SHOW CREATE TABLE city;
輸出中可見完整的 CONSTRAINT、FOREIGN KEY、REFERENCES 及 ON UPDATE/DELETE 子句。
善用外鍵能在資料庫層面強制保障資料一致性,減少應用層防禦性程式碼。掌握建立、刪除、級聯選項與檢查控制,能讓資料模型更健壯、維護更從容。