電腦製造商: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
| 選項 | 行為 | 適用場景 |
|---|---|---|
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 可檢視完整外鍵定義。