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

MySQL 外鍵完整指南:建立、刪除、級聯動作、檢查控制與最佳實踐

     編輯:MySQL 資料庫相關知識

外鍵核心目的

保證參考完整性:子表外鍵值必須存在於父表主鍵/唯一鍵中。

建立外鍵

建表時

CREATE TABLE city (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    country_id INT,
    KEY idx_fk_country_id (country_id),  -- 建議先建索引
    CONSTRAINT fk_city_country
        FOREIGN KEY (country_id) REFERENCES country(country_id)
        ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;

事後新增

ALTER TABLE city ADD INDEX idx_city_country (country_id);
ALTER TABLE city ADD CONSTRAINT fk_city_country
    FOREIGN KEY (country_id) REFERENCES country(country_id)
    ON DELETE CASCADE;

外鍵動作選項

動作父表 UPDATE父表 DELETE說明
RESTRICT (預設)阻止阻止子表有關聯資料時禁止
CASCADE同步更新子表同步刪除子表級聯傳播
SET NULL子表設 NULL子表設 NULL需子表欄位允許 NULL
NO ACTION阻止阻止標準 SQL,等同 RESTRICT
SET DEFAULT子表設預設值子表設預設值較少用,需有 DEFAULT

注意:ON DELETE RESTRICT 與 ON DELETE CASCADE 不能同時定義。

刪除外鍵

ALTER TABLE city DROP FOREIGN KEY fk_city_country;

若未命名,MySQL 自動產生名稱,查看:

SHOW CREATE TABLE city;
-- 輸出中找到 CONSTRAINT `xxx` FOREIGN KEY ...
-- 再用該名稱 DROP

臨時關閉外鍵檢查

SET FOREIGN_KEY_CHECKS = 0;
-- 大量匯入、LOAD DATA、結構變更
SET FOREIGN_KEY_CHECKS = 1;
  • 適用:跨表匯入順序不確定、結構重組
  • 風險:關閉期間違反完整性的資料會寫入,開啟後不自動驗證歷史資料

最佳實踐與避坑

  1. 必須用 InnoDB:MyISAM 不支援外鍵
  2. 外鍵欄位建索引:MySQL 4.1.2+ 自動建立,舊版需手動
  3. 類型完全一致:父表 INT UNSIGNED → 子表必須 INT UNSIGNED
  4. 謹慎用 CASCADE:誤刪父表導致子表資料雪崩式消失,建議 RESTRICT + 應用層軟刪除
  5. 效能成本:每次 INSERT/UPDATE/DELETE 額外檢查父表,高寫入場景評估是否移至應用層
  6. 避免循環引用:A→B→C→A 會導致鎖死或無法刪除

檢查外鍵狀態

SELECT TABLE_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, DELETE_RULE, UPDATE_RULE
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'mydb';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved