假設某電腦製造商,資料庫保存整機與配件產品資訊。整機資訊表稱 Pc;配件供貨資訊表稱 Parts。
Pc 表有欄位描述電腦使用的 CPU 型號。Parts 表有對應欄位描述 CPU 型號,可視為所有 CPU 型號清單。顯然,廠商生產的電腦其 CPU 型號一定存在 Parts 表中。兩表間存在約束關係——Pc 表的 CPU 型號受 Parts 表型號約束。
CREATE TABLE parts (
... 欄位定義 ...,
model VARCHAR(20) NOT NULL,
... 欄位定義 ...
);
CREATE TABLE pc (
... 欄位定義 ...,
cpumodel VARCHAR(20) NOT NULL,
... 欄位定義 ...
);
若要設定外鍵,參照表(pc)與被參照表(parts)中對應的兩個欄位必須都建立索引。
ALTER TABLE parts ADD INDEX idx_model (model);
ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);
這兩索引也可在建表時直接建立,此處分開僅為強調必要性。
建立兩表間「約束」:pc 的 CPU 型號必須參照 parts 表對應型號,故將 pc.cpumodel 設為「外鍵」。
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
pc 表設外鍵,命名為 fk_cpu_model。cpumodel 設為外鍵。parts 表的 model 欄位。完成後,若嘗試建立一台 Pc 其 CPU 型號不存在於 Parts 表,MySQL 會禁止建立。
考慮情況:技術人員發現一個月前輸入 parts 表某系列 CPU 型號(可能有多款)全輸錯一字母,需修正。希望 parts 表被參照欄位變更時,pc 表參照欄位自動更正。
在定義外鍵時加入關鍵字:
ON UPDATE CASCADE;
完整語句:
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON UPDATE CASCADE;
除 CASCADE 外,還有 RESTRICT(禁止主表變更)、SET NULL(子表對應欄位設為 NULL)等操作。