首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL外鍵約束完整指南:建立關聯、参照完整性與級聯動作實戰

     編輯:MySQL 資料庫相關知識

外鍵是維護資料庫參考完整性的核心機制,強制子表資料值必須存在於父表主鍵中,防止孤兒記錄產生。本文涵蓋建立前提、語法、級聯選項與實戰範例。

建立前提

  • 本表欄位型別**必須與**父表主鍵型別完全一致。
  • 父表欄位必須為**主鍵**或**唯一索引**。
  • 儲存引擎必須支援外鍵(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:父表異動時的子表級聯行為。

五種級聯動作選項

實戰範例:客戶-訂單關聯

-- 父表:客戶主檔
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查看詳細外鍵錯誤訊息。

善用外鍵約束,將業務規則下沉至資料庫層,能大幅減少應用層防禦性程式碼,確保資料長期一致可信。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
選項行為適用場景
CASCADE子表同步刪除/更新強一致性需求,如訂單-明細
RESTRICT阻止父表異動(預設)保護歷史資料,防誤刪
SET NULL子表外鍵設為NULL外鍵允許NULL,如員工-部門
SET DEFAULT子表外鍵設為預設值有明確預設值業務場景
NO ACTION同RESTRICT,標準SQL語法明確語意表達