首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 外鍵深度解析:概念、作用機制、使用規則與常見誤區

     編輯:MySQL 綜合教學

什麼是外鍵?

外鍵是**從表(子表)**某欄位引用**主表(父表)**主鍵或唯一鍵的約束機制。它建立表與表之間的強關聯,確保引用完整性。

+----------+     REFERENCES      +----------+
|  從表    |  -----------------> |  主表    |
| (子表)   |   外鍵引用主鍵     | (父表)   |
+----------+                     +----------+

實例:學生與成績表

  • 主表 student:sid (PK)、name、class_id
  • 從表 score:id (PK)、stu_id (FK → student.sid)、course、grade

外鍵定義在 score.stu_id 上,引用 student.sid。這樣:

  1. 插入成績時,學號必須存在於 student 表
  2. 刪除學生時,若成績表仍有記錄則禁止刪除(或級聯刪除)
  3. 修改學號時,同步更新或限制

外鍵的核心價值:一致性與完整性

維度無外鍵有外鍵
資料孤兒允許插入不存在的學號拒絕,報錯 1452
誤刪保護可直接刪除仍被引用的學生預設阻擋,報錯 1451
型別一致應用層自行保證資料庫強制型別相同

外鍵建立規則(硬性限制)

  1. 型別完全一致:從表 FK 欄位型別、長度、簽署、字符集必須與主表 PK/UK 完全相同
  2. 主表被引用欄位必須為主鍵或唯一鍵:確保引用目標唯一
  3. 存儲引擎支援:僅 InnoDB 支援外鍵,MyISAM 忽略語法但不生效
  4. 索引要求:主表被引用欄位需有索引(PK/UK 自動),從表 FK 欄位 MySQL 自動建立索引

常見誤區糾正

誤區 1:主從關係搞反

❌ 「給主表加外鍵」 → ✅ 「給從表加外鍵,引用主表主鍵」

誤區 2:外鍵必須是主鍵

❌ 「外鍵欄位一定要是主鍵」 → ✅ 「外鍵可引用主鍵或唯一鍵;從表 FK 本身不需是 PK」

誤區 3:一張表只能有一個外鍵

✅ 可有多個 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設為預設值

效能與架構考量

  • 寫入開銷:每次 INSERT/UPDATE/DELETE 需檢查父表、鎖定相關行
  • 鎖升級風險:大量級聯操作可能導致鎖爭用
  • 備份/遷移複雜度:須按順序匯入(先主表後從表)
  • 高併發建議:核心交易表可考慮應用層維護完整性,減少資料庫鎖競爭

查看與管理

-- 查看表的外鍵
SHOW CREATE TABLE table_name;

-- 查看所有外鍵資訊
SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';

-- 刪除外鍵
ALTER TABLE score DROP FOREIGN KEY fk_name;

總結

外鍵是資料庫層面的「契約」,以犧牲部分寫入效能換取資料強一致性。適用於:核心業務表、審計要求嚴格、團隊缺乏應用層完整性保障機制的場景。高併發、大數據量、頻繁架構變更的系統需謹慎評估。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved