外鍵(Foreign Key)確保跨表資料參考完整性。MySQL 僅 InnoDB 引擎支援,本文涵蓋建立語法、級聯規則、實戰示範與效能權衡。
[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;
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;
SET FOREIGN_KEY_CHECKS=0,完成後重開