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

MySQL 外鍵約束完整教學:建立、級聯操作、刪除與效能考量

     編輯:MySQL 綜合教學

MySQL 外鍵約束完整教學:建立、級聯操作、刪除與效能考量

外鍵(Foreign Key)確保跨表資料參考完整性。MySQL 僅 InnoDB 引擎支援,本文涵蓋建立語法、級聯規則、實戰示範與效能權衡。

使用條件

  1. 兩表皆為 InnoDB 引擎(MyISAM 不支援)
  2. 外鍵欄位需有索引(5.1.2+ 自動建立)
  3. 參考欄位資料型別相容(如 INT 對 BIGINT 可,INT 對 CHAR 不可)

外鍵定義語法

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

觸發動作選項

動作說明
RESTRICT阻止父表異動(預設)
CASCADE子表跟隨異動(刪除/更新)
SET NULL子表外鍵設為 NULL(欄位需允許 NULL)
SET DEFAULT子表外鍵設為預設值
NO ACTION同 RESTRICT,標準 SQL 語法

實戰示範:大哥與小弟

-- 父表:大哥
CREATE TABLE `dage` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(32) DEFAULT '',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 子表:小弟(含外鍵)
CREATE TABLE `xiaodi` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `dage_id` INT(11) DEFAULT NULL,
    `name` VARCHAR(32) DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `dage_id` (`dage_id`),
    CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

測試場景

  1. 新增大哥「銅鑼灣」 → 成功
  2. 新增小弟「銅鑼灣_小弟A」關聯大哥 ID=1 → 成功
  3. 嘗試刪除大哥 ID=1 → 失敗(ERROR 1451:外鍵約束失敗)
  4. 嘗試新增小弟關聯不存在的大哥 ID=2 → 失敗(ERROR 1452)

加上 CASCADE 級聯後

ALTER TABLE xiaodi DROP FOREIGN KEY xiaodi_ibfk_1;
ALTER TABLE xiaodi ADD FOREIGN KEY (dage_id) REFERENCES dage(id)
    ON DELETE CASCADE ON UPDATE CASCADE;
  • 刪除大哥 → 關聯小弟自動刪除
  • 更新大哥 ID → 小弟外鍵自動更新

效能與架構考量

  • 優點:資料完整性由資料庫保證,應用層邏輯簡化
  • 缺點:每次 INSERT/UPDATE/DELETE 需檢查約束,高併發下影響效能
  • 選擇策略:
    • 核心業務、資料一致性要求高 → InnoDB + 外鍵
    • 高寫入、日誌、快取、暫存表 → MyISAM 或 InnoDB 無外鍵
  • 大量匯入資料時可暫時 SET FOREIGN_KEY_CHECKS=0,完成後重開
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved