首頁
編程語言
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');

-- 子表:動物園動物,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)

外鍵的刪除與新增

  1. 查看內部約束名:SHOW CREATE TABLE zoo; → 如 `CONSTRAINT zoo_ibfk_1`
  2. 刪除:ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;
  3. 新增:ALTER TABLE zoo ADD FOREIGN KEY (FK_species) REFERENCES species (id);

效能與穩健的平衡

外鍵驗證屬內部資源消耗操作,複雜關聯網可能影響寫入效能。建議:
核心業務表(訂單、帳戶、庫存)務必啟用外鍵;
日誌、暫存、高寫入低一致性要求表可應用層控制,犧牲約束換取吞吐。

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