參照完整性確保表間關聯始終指向合法存在的記錄,防止「孤兒資料」產生。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');
-- 子表:動物園動物,FK_species 參照 species.id
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;
INSERT INTO zoo VALUES (1, 'Harry', 5); -- 錯誤 1216:species 無 id=5
INSERT INTO zoo VALUES (1, 'Harry', 3); -- 成功:species 有 id=3 (hippopotamus)
SHOW CREATE TABLE zoo; → 如 `CONSTRAINT zoo_ibfk_1`ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;ALTER TABLE zoo ADD FOREIGN KEY (FK_species) REFERENCES species (id);外鍵驗證屬內部資源消耗操作,複雜關聯網可能影響寫入效能。建議:
核心業務表(訂單、帳戶、庫存)務必啟用外鍵;
日誌、暫存、高寫入低一致性要求表可應用層控制,犧牲約束換取吞吐。