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

MySQL 主鍵與外鍵關系實戰:從概念到級聯操作完整演示

     編輯:MySQL 資料庫相關知識

核心概念通俗解讀

  • 主鍵 (PK):表中唯一標識記錄的列(如帖子 ID),訪問時 thread.php?id=1 即查主鍵=1 的主貼。
  • 外鍵 (FK):子表列引用父表主鍵,建立關聯。刪除父表記錄時,可自動級聯處理子表數據(如刪帖連帶刪回覆),無需手動雙删。

關系本質:子表外鍵指向父表主鍵。

完整建表示例:大哥 (dage) 與小弟 (xiaodi)

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;

約束行為實測

默認 RESTRICT(拒絕操作)

# 插入大哥 '銅鑼灣' (id=1)
# 插入小弟 '銅鑼灣_小弟A' (dage_id=1)
# 嘗試刪除大哥 id=1
ERROR 1451: Cannot delete parent row: foreign key constraint fails

# 嘗試插入不存在大哥的小弟 (dage_id=2)
ERROR 1452: Cannot add child row: foreign key constraint fails

修改為 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=1
Query OK, 1 row affected
# 查詢 xiaodi 表 → Empty set (小弟自動被刪除)

外鍵定義語法詳解

[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/NO ACTION:拒絕父表刪改(默認)。
  • CASCADE:父表刪改 → 子表同步刪改。
  • SET NULL:父表刪改 → 子表外鍵列置 NULL(列不能為 NOT NULL)。
  • SET DEFAULT:InnoDB 暫不支持。

使用前提(硬性條件)

  1. 兩表均為 InnoDB 引擎。
  2. 外鍵列必須有索引(5.1.2+ 自動創建,舊版需手動建)。
  3. 引用列數據類型兼容(如 INT ↔ TINYINT 可,INT ↔ CHAR 不可)。

常用兩種業務模式

  1. 保護子數據:ON UPDATE CASCADE ON DELETE RESTRICT(父改子改,父刪有子則拒絕)。
  2. 生命週期綁定:ON UPDATE CASCADE ON DELETE CASCADE(父刪子隨之刪除)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved