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

MySQL 外鍵約束 ON DELETE / ON UPDATE 詳解:RESTRICT、NO ACTION、CASCADE、SET NULL 行為差異

     編輯:MySQL 綜合教學

MySQL 外鍵約束 ON DELETE / ON UPDATE 詳解:RESTRICT、NO ACTION、CASCADE、SET NULL 行為差異

外鍵約束定義父表(被引用表)記錄變更時,子表(引用表)的聯動行為。MySQL 支援四種動作,本文通過對比表與實例闡述差異。

動作對比表

動作ON DELETE 行為ON UPDATE 行為前提條件
RESTRICT檢查子表有無引用,有則**拒絕刪除**父表行檢查子表有無引用,有則**拒絕更新**父表主鍵無
NO ACTION標準 SQL 語義,**等同 RESTRICT**(MySQL 內部同義)等同 RESTRICT無
CASCADE**級聯刪除**子表對應行**級聯更新**子表外鍵值無
SET NULL子表外鍵列**置 NULL**子表外鍵列**置 NULL**外鍵列必須允許 NULL

實例:訂單-用戶表

CREATE TABLE users (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50)
) ENGINE=InnoDB;

CREATE TABLE orders (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  user_id INT UNSIGNED,
  amount DECIMAL(10,2),
  CONSTRAINT fk_orders_user
    FOREIGN KEY (user_id) REFERENCES users(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE=InnoDB;

行為演示

INSERT INTO users (name) VALUES ('Alice'), ('Bob');
INSERT INTO orders (user_id, amount) VALUES (1, 100), (1, 200), (2, 50);

-- 1. CASCADE DELETE
DELETE FROM users WHERE id = 1;
-- orders 中 user_id=1 的兩筆自動刪除

-- 2. CASCADE UPDATE
UPDATE users SET id = 10 WHERE id = 2;
-- orders 中 user_id=2 自動更新為 10

-- 3. 若改為 SET NULL(需 ALTER TABLE 修改約束)
-- DELETE FROM users WHERE id = 10; → orders.user_id 變 NULL
-- UPDATE users SET id = 20 WHERE id = 10; → orders.user_id 變 NULL

RESTRICT vs NO ACTION 細微差別

  • 標準 SQL:NO ACTION 檢查延遲到**所有約束檢查之後**;RESTRICT **立即檢查**、優先級最高。
  • MySQL 實作:兩者**完全同義**,無延遲檢查機制,均為立即拒絕。

選型建議

  1. 核心主從關係(用戶-訂單、分類-商品):ON DELETE RESTRICT,防止誤刪主體導致資料孤兒;業務層軟刪除(is_deleted=1)替代物理刪除。
  2. 臨時/弱關聯(日誌-用戶、標籤-文章):ON DELETE SET NULL,保留子表記錄但切斷關聯。
  3. 強生命週期綁定(會員-會員詳情、訂單-付款記錄):ON DELETE CASCADE,主體消失從體必亡。
  4. 主鍵極少變更:ON UPDATE CASCADE 可防止手工修改主鍵導致不一致;但**主鍵一旦生成應不可變**,建議 RESTRICT。

效能與風險提示

  • CASCADE 大量級聯會產生大事務、長鎖、主從延遲,百萬級子表慎用。
  • 外鍵檢查增加寫入開銷(每 INSERT/UPDATE 需查詢父表),高併發寫入場景可考慮**應用層維護參考完整性**,移除資料庫級外鍵。
  • SET FOREIGN_KEY_CHECKS=0 可暫時關閉檢查(匯入資料時),操作完必須 =1。

外鍵是資料完整性的守門員,用對動作能讓業務邏輯在資料庫層自動兜底;用錯則可能引發級聯風暴。

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