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

MySQL 外鍵約束入門:條件、語法、級聯動作與實戰案例

     編輯:MySQL 綜合教學

MySQL 外鍵約束入門:條件、語法、級聯動作與實戰案例

外鍵是關系型數據庫維護數據完整性的核心機制。MySQL 中僅 InnoDB 支持外鍵,本文系統梳理使用條件、定義語法、五種級聯動作、ALTER TABLE 增刪操作,並通過「大哥/小弟」實戰案例演示約束生效與級聯刪除/更新行為。

一、使用前提條件

  1. 雙表必須為 InnoDB:MyISAM 不支持(舊版本傳聞未來可能支持,但生產環境勿賭)。
  2. 外鍵列必須建立索引:MySQL 4.1.2+ 建外鍵時自動創建,早期版本需手動建索引。
  3. 關聯列數據類型兼容:如 INT 對應 TINYINT 可,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}]

可在 CREATE TABLE 或 ALTER TABLE 時使用。未指定 CONSTRAINT symbol 時 MySQL 自動生成名稱。

三、五種級聯動作詳解

動作行為InnoDB 支持
RESTRICT拒絕父表刪除/更新(默認)✓
CASCADE級聯刪除/更新子表匹配行✓
SET NULL子表外鍵列置 NULL(列需允許 NULL)✓
NO ACTION同 RESTRICT,標準 SQL 語法✓
SET DEFAULT子表外鍵列置默認值✗ 不支持

常見組合:

  • 父表更新級聯、刪除限制:ON UPDATE CASCADE ON DELETE RESTRICT
  • 父表更新/刪除均級聯:ON UPDATE CASCADE ON DELETE CASCADE

四、ALTER TABLE 增刪外鍵

# 添加外鍵
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...) [ON DELETE ...] [ON UPDATE ...]

# 刪除外鍵
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

五、實戰案例:大哥表與小弟表

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:默認 RESTRICT

INSERT INTO dage(name) VALUES('銅鑼灣');  -- id=1
INSERT INTO xiaodi(dage_id,name) VALUES(1,'銅鑼灣_小弟A');
DELETE FROM dage WHERE id=1;
-- ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails

場景 2:插入不存在的外鍵值

INSERT INTO xiaodi(dage_id,name) VALUES(2,'旺角_小弟A');
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

場景 3:改為 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;
DELETE FROM dage WHERE id=1;
-- Query OK, 1 row affected
SELECT * FROM xiaodi; -- Empty set

外鍵約束讓數據庫層面自動維護引用完整性,減少應用代碼邏輯錯誤,但在高並發寫入場景下需評估鎖競爭影響,合理選擇級聯策略。

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