thread.php?id=1 即查主鍵=1 的主貼。關系本質:子表外鍵指向父表主鍵。
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;
# 插入大哥 '銅鑼灣' (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
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 暫不支持。ON UPDATE CASCADE ON DELETE RESTRICT(父改子改,父刪有子則拒絕)。ON UPDATE CASCADE ON DELETE CASCADE(父刪子隨之刪除)。