INDEX(4.1.2+ 自動創建,舊版需手動);INT 對應 INT、TINYINT 不對應 INT。[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
可用於 CREATE TABLE 或 ALTER TABLE。未指定 CONSTRAINT 名時 MySQL 自動生成。
| 動作 | 父表刪除/更新時,子表行如何處理 |
|---|---|
RESTRICT | 拒絕操作,報錯(默認) |
CASCADE | 同步刪除/更新子表匹配行 |
SET NULL | 子表外鍵列置 NULL(列必須允許 NULL) |
SET DEFAULT | 子表外鍵列置默認值(MySQL 解析器識別但 InnoDB 拒絕執行) |
NO ACTION | 標準 SQL 等價 RESTRICT,檢查時機不同 |
CREATE TABLE parent (
id INT PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
INDEX idx_parent (parent_id),
CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
DROP FOREIGN KEY → ALTER ENGINE → 重建外鍵。INSERT/UPDATE/DELETE 時額外開銷,高寫入場景可考慮應用層維護完整性,SET FOREIGN_KEY_CHECKS=0 批量導數據;SHOW CREATE TABLE 查看外鍵定義;INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 查詢所有外鍵關係;