外鍵是維護資料庫參考完整性的核心機制,強制子表資料值必須存在於父表主鍵中,防止孤兒記錄產生。本文涵蓋建立前提、語法、級聯選項與實戰範例。
建立前提
- 本表欄位型別**必須與**父表主鍵型別完全一致。
- 父表欄位必須為**主鍵**或**唯一索引**。
- 儲存引擎必須支援外鍵(InnoDB支援,MyISAM不支援)。
核心語法
CREATE TABLE child_table (
id INT,
name CHAR(20),
FOREIGN KEY (id) REFERENCES parent_table(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
FOREIGN KEY (欄位名):宣告本表外鍵欄位。
REFERENCES 父表(父表欄位):指定参照目標。
ON DELETE / ON UPDATE:父表異動時的子表級聯行為。
五種級聯動作選項
| 選項 | 行為 | 適用場景 |
CASCADE | 子表同步刪除/更新 | 強一致性需求,如訂單-明細 |
RESTRICT | 阻止父表異動(預設) | 保護歷史資料,防誤刪 |
SET NULL | 子表外鍵設為NULL | 外鍵允許NULL,如員工-部門 |
SET DEFAULT | 子表外鍵設為預設值 | 有明確預設值業務場景 |
NO ACTION | 同RESTRICT,標準SQL語法 | 明確語意表達 |
實戰範例:客戶-訂單關聯
-- 父表:客戶主檔
CREATE TABLE customers (
cust_id INT PRIMARY KEY,
cust_name VARCHAR(50)
) 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
) ENGINE=InnoDB;
業務邏輯:
- 刪除客戶時,若該客戶仍有訂單(
orders.cust_id存在),RESTRICT阻止刪除,保護訂單歷史完整性。
- 客戶ID變更時(極少見),
CASCADE自動更新所有關聯訂單的cust_id。
常見陷阱與排查
- 引擎不支援:預設建表為MyISAM,**必須顯式指定
ENGINE=InnoDB**。
- 型別不符:
INT vs BIGINT、UNSIGNED差異皆會導致建立失敗。
- 父表無索引:参照欄位必須有索引,主鍵自動滿足。
SHOW ENGINE INNODB STATUS查看詳細外鍵錯誤訊息。
善用外鍵約束,將業務規則下沉至資料庫層,能大幅減少應用層防禦性程式碼,確保資料長期一致可信。
- 上一篇文章: ASP.NET上傳圖片至MySQL資料庫完整實作:檔案流讀取與參數化查詢防注入
- 下一篇文章: Windows環境MySQL免安裝版(noinstall)完整部署指南:從解壓到服務註冊與備份還原
Copyright ©
程式碼之家 All Rights Reserved