INT UNSIGNED 對應 INT UNSIGNED,VARCHAR(20) utf8mb4 對應相同定義。pc 表:整機產品,欄位 cpu_model 記錄使用的 CPU 型號。parts 表:配件供貨資訊,欄位 model 為 CPU 型號清單(父表)。pc.cpu_model 必須存在於 parts.model 中。
-- 父表:配件資訊
CREATE TABLE parts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
model VARCHAR(20) NOT NULL,
description VARCHAR(100),
UNIQUE KEY uk_model (model) -- 關鍵:被參照欄位必須有索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 子表:整機產品
CREATE TABLE pc (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
cpu_model VARCHAR(20) NOT NULL,
KEY idx_cpu_model (cpu_model) -- 參照欄位建議建索引(InnoDB 會自動補)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE pc
ADD CONSTRAINT fk_pc_cpu_model
FOREIGN KEY (cpu_model) REFERENCES parts(model)
ON UPDATE CASCADE
ON DELETE RESTRICT;
語法解析:
CONSTRAINT fk_pc_cpu_model:約束名稱,全庫唯一,便於管理/刪除。FOREIGN KEY (cpu_model):子表參照欄位。REFERENCES parts(model):父表被參照欄位。ON UPDATE CASCADE:父表 model 更新時,子表自動同步更新(級聯更新)。ON DELETE RESTRICT:父表有對應記錄時,禁止刪除父表記錄(保護資料完整性)。| 選項 | 父表操作 | 子表自動行為 | 適用場景 |
|---|---|---|---|
| CASCADE | UPDATE / DELETE | 同步 UPDATE / 同步 DELETE | 強一致性需求,如訂單-明細、分類-商品 |
| SET NULL | UPDATE / DELETE | 子表外鍵欄位設為 NULL(欄位必須允許 NULL) | 弱關聯,如用戶-文章(用戶刪除、文章保留但標記無擁有者) |
| RESTRICT / NO ACTION | UPDATE / DELETE | 拒絕操作、報錯 | 保護核心主數據不被誤刪,如字典表、配置表 |
| SET DEFAULT | UPDATE / DELETE | 子表外鍵欄位設為預設值(罕用) | 極少見,需欄位有 DEFAULT 值 |
RESTRICT 保護。CASCADE,但需壓測驗證效能影響。
-- 查看表的外鍵
SHOW CREATE TABLE pc\G
-- 看到 CONSTRAINT `fk_pc_cpu_model` FOREIGN KEY ...
-- 查看資訊結構
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'db_name';
-- 刪除外鍵
ALTER TABLE pc DROP FOREIGN KEY fk_pc_cpu_model;