參照完整性是關聯式資料庫設計中的核心概念,確保資料表之間的關聯關係始終保持有效。當資料庫強制執行參照完整性時,任何指向不存在記錄的外鍵值都會被拒絕,從而防止孤立資料的產生,保證資料的準確性與一致性。
早期的 MySQL(特別是 MyISAM 引擎)並不支援外鍵,官方理由是外鍵檢查會影響效能。但隨著企業級應用需求增長,MySQL 從 3.23 版本起透過 InnoDB 儲存引擎開始完整支援外鍵約束,使得在資料庫層面維護參照完整性變得簡單可行。
建立物種表 species 與動物園動物表 zoo,透過 species_id 建立外鍵關聯:
CREATE TABLE species (
id TINYINT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE zoo (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
species_id TINYINT NOT NULL,
INDEX (species_id),
FOREIGN KEY (species_id) REFERENCES species (id),
PRIMARY KEY (id)
) ENGINE=InnoDB;
嘗試插入不存在的物種 ID 會被拒絕:
INSERT INTO zoo VALUES (1, 'Harry', 5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
插入合法的物種 ID 則成功:
INSERT INTO zoo VALUES (1, 'Harry', 3);
-- Query OK, 1 row affected
查看外鍵約束名稱:
SHOW CREATE TABLE zoo;
-- 會顯示類似 CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`species_id`) REFERENCES `species` (`id`)
刪除外鍵:
ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;
新增外鍵:
ALTER TABLE zoo ADD FOREIGN KEY (species_id) REFERENCES species (id);
外鍵檢查雖會增加寫入操作的開銷,但能在資料庫層面攔截錯誤資料,避免應用層面的複雜驗證邏輯。對於資料一致性要求高的系統,建議啟用外鍵;極高併發寫入場景可評估在應用層控制並定期做一致性檢查。