保證參考完整性:子表外鍵值必須存在於父表主鍵/唯一鍵中。
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;
INT UNSIGNED → 子表必須 INT UNSIGNEDRESTRICT + 應用層軟刪除SELECT TABLE_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, DELETE_RULE, UPDATE_RULE
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'mydb';