錯誤訊息
[Err] 1215 - Cannot add foreign key constraint
SQL 片段
CONSTRAINT `fk_orderdetail_oid` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`),
CONSTRAINT `fk_orderdetail_fname` FOREIGN KEY (`fname`) REFERENCES `fruit` (`fname`),
CONSTRAINT `fk_orderdetail_fprice` FOREIGN KEY (`fprice`) REFERENCES `fruit` (`fprice`)
三大核心原因
- 資料型別不一致:父表
orders.oid 與子表 orderdetail.oid 型別、長度、編碼、是否簽名必須完全相同 (如同為 VARCHAR(20) CHARSET utf8mb4)
- 儲存引擎不一致:外鍵僅支援
InnoDB,確認 SHOW TABLE STATUS 兩表 Engine 皆為 InnoDB
- 參考欄位非唯一/非索引:父表欄位必須為
PRIMARY KEY 或 UNIQUE KEY,且已建立索引
排查 SQL
-- 1. 檢查型別與編碼
SHOW CREATE TABLE orders;
SHOW CREATE TABLE fruit;
SHOW CREATE TABLE orderdetail;
-- 2. 檢查引擎
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME IN ('orders','fruit','orderdetail');
-- 3. 檢查父表索引
SHOW INDEX FROM orders WHERE Key_name = 'PRIMARY';
SHOW INDEX FROM fruit WHERE Column_name IN ('fname','fprice');
特殊注意
fprice 為 DECIMAL(5,2) 作外鍵極不推薦:浮點比較、價格變動導致級聯更新困難
- 若父表資料已存在,子表插入前必須確保參考值存在
- 設定
ON DELETE/UPDATE CASCADE|SET NULL|RESTRICT 視業務而定