首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 外鍵與參照完整性:InnoDB 實戰指南

     編輯:MySQL 資料庫相關知識

外鍵通過強制子表字段值必須存在於父表主鍵/唯一鍵中,實現參照完整性,防止孤兒記錄。MySQL 僅 InnoDB 支援。

三大前置條件

  1. 父子表均為 ENGINE=InnoDB。
  2. 外鍵列必須建立索引(子表自動創建,父表需主鍵/唯一索引)。
  3. 外鍵列數據類型、長度、字符集**完全一致**。

建表示例

-- 父表:物種
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 等)可能引發鎖升級與死鎖。
  • 讀多寫少、數據完整性敏感業務(訂單、財務)強烈建議啟用;日志、埋點等寫入密集業務可在應用層保證完整性。

外鍵圖解

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved