外鍵的核心價值在於維護參照完整性:子表資料只能引用父表已存在的值。本文系統整理 MySQL 外鍵的建立語法、五大級聯動作、實戰範例與常見誤區,助你快速掌握。
| 要素 | 關鍵字 | 說明 |
|---|---|---|
| 指定外鍵欄位 | FOREIGN KEY (col_name) | 子表中作為外鍵的欄位 |
| 引用父表欄位 | REFERENCES parent_table (parent_col) | 父表名與被參照欄位(需為 PK 或 UNIQUE) |
| 刪除觸發動作 | ON DELETE {CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION} | 父表刪除時子表行為 |
| 更新觸發動作 | ON UPDATE {CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION} | 父表更新時子表行為 |
CREATE TABLE outTable (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB;
CREATE TABLE temp (
id INT,
name CHAR(20),
FOREIGN KEY (id) REFERENCES outTable(id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
效果:outTable.id 刪除/更新 → temp.id 自動級聯刪除/更新。
NULL(欄位必須允許 NULL)。DEFAULT 值(需定義預設值)。RESTRICT。CREATE TABLE customers (
cust_id INT PRIMARY KEY,
cust_name VARCHAR(100)
) ENGINE=InnoDB;
CREATE TABLE orders (
order_id INT PRIMARY KEY,
cust_id INT,
order_date DATE,
FOREIGN KEY (cust_id) REFERENCES customers(cust_id)
ON DELETE RESTRICT -- 有訂單的客戶不能刪
ON UPDATE CASCADE -- 客戶 ID 變更,訂單自動同步
) ENGINE=InnoDB;
-- 添加
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customers
FOREIGN KEY (cust_id) REFERENCES customers(cust_id)
ON DELETE RESTRICT ON UPDATE CASCADE;
-- 移除(需先查約束名)
SHOW CREATE TABLE orders;
-- 假設約束名為 fk_orders_customers
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customers;
SHOW TABLE STATUS LIKE 'tbl'\G 確認 Engine: InnoDB。PRIMARY KEY 或 UNIQUE INDEX。SHOW CREATE TABLE 對比 CHARSET、COLLATION、長度。INT vs BIGINT、VARCHAR(20) vs VARCHAR(30)。SET FOREIGN_KEY_CHECKS=0,結束後 =1 並執行一致性檢查。fk_子表_父表_欄位,便於 information_schema 管理。MySQL 外鍵雖非強制,卻是資料庫層面最經濟的「資料契約」。掌握 REFERENCES、ON DELETE/UPDATE 五大動作語義,配合 InnoDB 引擎與索引前置條件,即可構建健壯的關聯資料模型。