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

MySQL 外鍵設置詳解:語法、動作選項、實戰範例與避坑指南

     編輯:MySQL 綜合教學

前言:外鍵讓資料關聯「有法可依」

外鍵的核心價值在於維護參照完整性:子表資料只能引用父表已存在的值。本文系統整理 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 自動級聯刪除/更新。

五大級聯動作行為對照

  1. CASCADE(級聯):父變,子跟著變/刪。最常用於「主檔-明細」關係。
  2. RESTRICT(限制):有子記錄引用時,阻止父表刪除/更新。預設行為。
  3. SET NULL(置空):父表刪除/更新 → 子表外鍵欄位設為 NULL(欄位必須允許 NULL)。
  4. SET DEFAULT(預設值):子表外鍵欄位重置為 DEFAULT 值(需定義預設值)。
  5. NO ACTION(無動作):標準 SQL 語法,MySQL 中等同 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;

避坑指南:外鍵不生效的 5 大原因

  1. 引擎非 InnoDB:SHOW TABLE STATUS LIKE 'tbl'\G 確認 Engine: InnoDB。
  2. 父表欄位無唯一索引:被參照欄位必須為 PRIMARY KEY 或 UNIQUE INDEX。
  3. 字元集/校對規則不一致:SHOW CREATE TABLE 對比 CHARSET、COLLATION、長度。
  4. 資料型別不完全相同:如 INT vs BIGINT、VARCHAR(20) vs VARCHAR(30)。
  5. 已存在髒資料:子表含父表無對應值的記錄,建立外鍵會報錯,需先清洗。

效能考量與最佳實踐

  • 外鍵檢查發生在寫入時,高併發寫入場景會增加鎖競爭;可評估應用層驗證 + 定期一致性掃描替代。
  • 大批量匯入前 SET FOREIGN_KEY_CHECKS=0,結束後 =1 並執行一致性檢查。
  • 命名規範:fk_子表_父表_欄位,便於 information_schema 管理。

結語

MySQL 外鍵雖非強制,卻是資料庫層面最經濟的「資料契約」。掌握 REFERENCES、ON DELETE/UPDATE 五大動作語義,配合 InnoDB 引擎與索引前置條件,即可構建健壯的關聯資料模型。

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