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

MySQL 外鍵約束完整實戰:索引前置條件、定義語法、級聯操作(CASCADE/SET NULL/RESTRICT)與效能考量

     編輯:MySQL 綜合教學

外鍵核心前置條件

  1. 兩表引擎必須支援外鍵:僅 InnoDB 支援,MyISAM/MEMORY 不支援。
  2. 參照欄位與被參照欄位必須建立索引:InnoDB 會自動為外鍵欄位建立索引,但被參照表(父表)的參照欄位必須已有索引(通常為 PRIMARY KEY 或 UNIQUE KEY)。
  3. 資料型別、長度、字符集、排序規則必須完全一致:INT UNSIGNED 對應 INT UNSIGNED,VARCHAR(20) utf8mb4 對應相同定義。

實戰案例:電腦廠商產品與配件關聯

場景

  • pc 表:整機產品,欄位 cpu_model 記錄使用的 CPU 型號。
  • parts 表:配件供貨資訊,欄位 model 為 CPU 型號清單(父表)。
  • 業務規則:pc.cpu_model 必須存在於 parts.model 中。

建表與索引


-- 父表:配件資訊
CREATE TABLE parts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    model VARCHAR(20) NOT NULL,
    description VARCHAR(100),
    UNIQUE KEY uk_model (model)  -- 關鍵:被參照欄位必須有索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 子表:整機產品
CREATE TABLE pc (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    cpu_model VARCHAR(20) NOT NULL,
    KEY idx_cpu_model (cpu_model)  -- 參照欄位建議建索引(InnoDB 會自動補)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

定義外鍵約束


ALTER TABLE pc
ADD CONSTRAINT fk_pc_cpu_model
FOREIGN KEY (cpu_model) REFERENCES parts(model)
ON UPDATE CASCADE
ON DELETE RESTRICT;

語法解析:

  • CONSTRAINT fk_pc_cpu_model:約束名稱,全庫唯一,便於管理/刪除。
  • FOREIGN KEY (cpu_model):子表參照欄位。
  • REFERENCES parts(model):父表被參照欄位。
  • ON UPDATE CASCADE:父表 model 更新時,子表自動同步更新(級聯更新)。
  • ON DELETE RESTRICT:父表有對應記錄時,禁止刪除父表記錄(保護資料完整性)。

級聯操作選項完整對比

選項父表操作子表自動行為適用場景
CASCADE UPDATE / DELETE 同步 UPDATE / 同步 DELETE 強一致性需求,如訂單-明細、分類-商品
SET NULL UPDATE / DELETE 子表外鍵欄位設為 NULL(欄位必須允許 NULL) 弱關聯,如用戶-文章(用戶刪除、文章保留但標記無擁有者)
RESTRICT / NO ACTION UPDATE / DELETE 拒絕操作、報錯 保護核心主數據不被誤刪,如字典表、配置表
SET DEFAULT UPDATE / DELETE 子表外鍵欄位設為預設值(罕用) 極少見,需欄位有 DEFAULT 值

外鍵效能與維護考量

優點

  • 資料庫層面強制保證參考完整性,應用層無需重複檢查。
  • 級聯操作簡化業務邏輯(如刪除分類自動清理商品)。

缺點與風險

  • 寫入效能開銷:每次 INSERT/UPDATE/DELETE 需檢查父表、加鎖、可能觸發級聯,高併發下成為瓶頸。
  • 鎖爭用風險:外鍵檢查會在父表加共享鎖(S-lock),大量併發寫入易導致鎖等待、死鎖。
  • Schema 變更困難:修改父表主鍵/外鍵欄位需先刪除約束、再重建,大表操作極慢。
  • 跨庫/分庫不支援:微服務/分庫分表架構下無法使用資料庫層面外鍵。

生產環境建議

  • 核心主數據(字典、配置、用戶):建立外鍵 + RESTRICT 保護。
  • 高併發業務表(訂單、交易、日誌):不建立外鍵,由應用層保證邏輯完整性,必要時用分散式事務/Saga 模式。
  • 中等併發、強一致性需求(訂單明細、庫存扣減):可建立外鍵 + CASCADE,但需壓測驗證效能影響。

查看與管理外鍵


-- 查看表的外鍵
SHOW CREATE TABLE pc\G
-- 看到 CONSTRAINT `fk_pc_cpu_model` FOREIGN KEY ...

-- 查看資訊結構
SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'db_name';

-- 刪除外鍵
ALTER TABLE pc DROP FOREIGN KEY fk_pc_cpu_model;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved