外鍵是**從表(子表)**某欄位引用**主表(父表)**主鍵或唯一鍵的約束機制。它建立表與表之間的強關聯,確保引用完整性。
+----------+ REFERENCES +----------+ | 從表 | -----------------> | 主表 | | (子表) | 外鍵引用主鍵 | (父表) | +----------+ +----------+
外鍵定義在 score.stu_id 上,引用 student.sid。這樣:
| 維度 | 無外鍵 | 有外鍵 |
|---|---|---|
| 資料孤兒 | 允許插入不存在的學號 | 拒絕,報錯 1452 |
| 誤刪保護 | 可直接刪除仍被引用的學生 | 預設阻擋,報錯 1451 |
| 型別一致 | 應用層自行保證 | 資料庫強制型別相同 |
❌ 「給主表加外鍵」 → ✅ 「給從表加外鍵,引用主表主鍵」
❌ 「外鍵欄位一定要是主鍵」 → ✅ 「外鍵可引用主鍵或唯一鍵;從表 FK 本身不需是 PK」
✅ 可有多個 FK,引用同一張表不同欄位,或引用多張不同主表
CREATE TABLE order ( buyer_id INT, -- FK → user.id seller_id INT, -- FK → user.id product_id INT -- FK → product.id );
-- 建表時定義
CREATE TABLE score (
id INT PRIMARY KEY,
stu_id INT,
FOREIGN KEY (stu_id) REFERENCES student(sid)
ON DELETE RESTRICT ON UPDATE CASCADE
);
-- 既有表添加
ALTER TABLE score ADD FOREIGN KEY (stu_id) REFERENCES student(sid);
| 動作 | 主表刪除/更新時 |
|---|---|
| RESTRICT / NO ACTION | 阻擋(預設) |
| CASCADE | 級聯刪除/更新從表記錄 |
| SET NULL | 從表 FK 設為 NULL(需允許 NULL) |
| SET DEFAULT | 設為預設值 |
-- 查看表的外鍵 SHOW CREATE TABLE table_name; -- 查看所有外鍵資訊 SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'; -- 刪除外鍵 ALTER TABLE score DROP FOREIGN KEY fk_name;
外鍵是資料庫層面的「契約」,以犧牲部分寫入效能換取資料強一致性。適用於:核心業務表、審計要求嚴格、團隊缺乏應用層完整性保障機制的場景。高併發、大數據量、頻繁架構變更的系統需謹慎評估。