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

MySQL 外鍵約束 ON DELETE/UPDATE 規則詳解:CASCADE、SET NULL、NO ACTION、RESTRICT、SET DEFAULT

     編輯:MySQL 綜合教學

InnoDB 外鍵約束定義了父表記錄變更時子表的聯動行為。正確選擇 ON DELETE/ON UPDATE 規則對數據一致性與業務邏輯至關重要。

五大引用動作對比

動作父表 DELETE/UPDATE 時子表行為適用場景MySQL 版本支援
CASCADE同步刪除/更新匹配的子表記錄強一致性、從屬關係明確(訂單-明細、分類-商品)DELETE: 3.23.50+
UPDATE: 4.0.8+
SET NULL將子表外鍵列置 NULL弱關聯、子表記錄需保留(日誌、審計、用戶刪除後文章保留)DELETE: 3.23.50+
UPDATE: 4.0.8+
NO ACTION若有匹配子記錄則拒絕父表操作(標準 SQL 延遲檢查)需應用層顯式處理子記錄、防止誤刪4.0.8+ (ANSI SQL-92)
RESTRICT同 NO ACTION,但立即檢查(InnoDB 實際同義)同 NO ACTION所有版本
SET DEFAULT解析器識別,但 InnoDB 不支援(報錯)不可用—

關鍵差異:NO ACTION vs RESTRICT

  • 標準 SQL:NO ACTION 延遲至語句結束檢查,允許中間狀態暫時違反;RESTRICT 立即檢查。
  • InnoDB 實現:兩者行為一致,均為立即檢查,無延遲差異。

DDL 定義範例

CREATE TABLE parent (
  id INT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE child (
  id INT PRIMARY KEY,
  parent_id INT,
  CONSTRAINT fk_child_parent
    FOREIGN KEY (parent_id) REFERENCES parent(id)
    ON DELETE CASCADE
    ON UPDATE SET NULL
) ENGINE=InnoDB;

重要限制與避坑

  1. 觸發器不會被級聯動作觸發:CASCADE DELETE 不會激活子表 BEFORE/AFTER DELETE TRIGGER。
  2. SET NULL 要求子表外鍵列允許 NULL(無 NOT NULL)。
  3. 外鍵列雙方數據類型、長度、字符集、校對規則必須完全一致。
  4. 父表被引用列必須有索引(主鍵/唯一/普通索引),子表外鍵列自動建立索引。
  5. 循環外鍵、自引用外鍵需謹慎設計,避免級聯死循環。
  6. 大表 CASCADE DELETE 可能引發鎖升級、複製表膨脹,評估改為應用層分批刪除。

查看現有外鍵定義

SELECT 
  TABLE_NAME, CONSTRAINT_NAME, 
  DELETE_RULE, UPDATE_RULE,
  REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'your_db';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved