外鍵通過強制子表字段值必須存在於父表主鍵/唯一鍵中,實現參照完整性,防止孤兒記錄。MySQL 僅 InnoDB 支援。
ENGINE=InnoDB。-- 父表:物種
CREATE TABLE species (
id TINYINT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO species VALUES (1,'orangutan'),(2,'elephant'),(3,'hippopotamus'),(4,'yak');
-- 子表:動物園動物
CREATE TABLE zoo (
id INT(4) NOT NULL,
name VARCHAR(50) NOT NULL,
fk_species TINYINT(4) NOT NULL,
INDEX (fk_species),
FOREIGN KEY (fk_species) REFERENCES species(id),
PRIMARY KEY (id)
) ENGINE=InnoDB;
-- 非法物種代碼 5,插入失敗
INSERT INTO zoo VALUES (1,'Harry',5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
-- 合法代碼 3,插入成功
INSERT INTO zoo VALUES (1,'Harry',3);
-- Query OK, 1 row affected
-- 查看外鍵約束名
SHOW CREATE TABLE zoo;
-- CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`fk_species`) REFERENCES `species` (`id`)
-- 刪除外鍵
ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;
-- 重新添加
ALTER TABLE zoo ADD FOREIGN KEY (fk_species) REFERENCES species(id);
ON DELETE CASCADE 等)可能引發鎖升級與死鎖。