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

MySQL 外鍵約束完整指南:從建表到級聯操作實戰

     編輯:MySQL 資料庫相關知識

業務場景

電腦製造商:pc 表(整機產品)、parts 表(配件供貨清單)。pc.cpumodel 必須引用 parts.model 中存在的型號。

建立被參照表

CREATE TABLE parts (
    model VARCHAR(20) NOT NULL,
    -- 其他欄位...
    PRIMARY KEY (model)
) ENGINE=InnoDB;

建立參照表

CREATE TABLE pc (
    cpumodel VARCHAR(20) NOT NULL,
    -- 其他欄位...
    PRIMARY KEY (id)
) ENGINE=InnoDB;

必要前置:雙邊建立索引

ALTER TABLE parts ADD INDEX idx_model (model);
ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

外鍵欄位**雙方必須有索引**,否則建立失敗。

定義外鍵約束

ALTER TABLE pc
ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel) REFERENCES parts (model);
  • fk_cpu_model:約束名稱(建議 fk_參照表_被參照表_欄位)。
  • FOREIGN KEY (cpumodel):本表欄位。
  • REFERENCES parts (model):目標表與欄位。

驗證約束生效

INSERT INTO parts (model) VALUES ('i7-12700');
INSERT INTO pc (cpumodel) VALUES ('i7-12700');  -- 成功
INSERT INTO pc (cpumodel) VALUES ('i9-9999');   -- ERROR 1452: Cannot add or update child row

級聯操作:ON UPDATE / ON DELETE

選項行為適用場景
CASCADE父表變更 → 子表同步變更代碼表修正、主鍵遷移
SET NULL父表刪除/更新 → 子表欄位置 NULL可選關聯(如訂單-客戶)
RESTRICT阻止父表變更(預設)核心主資料保護
NO ACTION同 RESTRICT,標準 SQL 語法—
SET DEFAULT子表欄位重置為 DEFAULT 值罕用

完整級聯定義範例

ALTER TABLE pc
ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel) REFERENCES parts (model)
ON UPDATE CASCADE
ON DELETE RESTRICT;

當 parts.model 批次修正拼寫錯誤時,pc.cpumodel 自動同步;刪除配件型號則被阻止,保護現有整機資料完整性。

效能與維護提醒

  • 外鍵檢查在 INSERT/UPDATE/DELETE 時觸發,高併發寫入場景評估鎖競爭。
  • 大量載入資料時可暫時關閉:SET FOREIGN_KEY_CHECKS=0; 載入完畢 SET FOREIGN_KEY_CHECKS=1;。
  • SHOW CREATE TABLE pc\G 可檢視完整外鍵定義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved