ERROR 1005 (HY000): Can't create table 'xxx.frm' (errno: 150)
執行 SHOW ENGINE INNODB STATUS 查看 LATEST FOREIGN KEY ERROR 區塊可得詳細原因。
CREATE TABLE booktype (
btid INT(5) UNSIGNED ZEROFILL AUTO_INCREMENT PRIMARY KEY,
btname VARCHAR(100) NOT NULL UNIQUE
);
CREATE TABLE books (
bid INT(5) UNSIGNED ZEROFILL AUTO_INCREMENT PRIMARY KEY,
btid INT, -- ❌ 缺少 UNSIGNED ZEROFILL
FOREIGN KEY (btid) REFERENCES booktype(btid)
);
外鍵欄位必須與被參考欄位類型、長度、符號、ZEROFILL 屬性完全一致:
btid INT(5) UNSIGNED ZEROFILL -- ✅ 修正後
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100)
) ENGINE=InnoDB;
CREATE TABLE line_items (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
FOREIGN KEY (product_id) REFERENCES producets(id), -- ❌ 拼寫錯誤:producets
INDEX (product_id)
) ENGINE=InnoDB;
REFERENCES products(id)。INDEX (product_id)),否則 UPDATE/DELETE 父表時需全表掃描鎖定子表,效能極差。| 檢查項目 | 要求 |
|---|---|
| 引擎 | 父表、子表皆為 ENGINE=InnoDB |
| 參考欄位類型 | 完全一致(含 UNSIGNED、ZEROFILL、CHARSET、COLLATION) |
| 參考欄位索引 | 父表欄位為 PK 或有獨立索引 |
| 外鍵欄位索引 | 子表外鍵欄位需 INDEX |
| 表名/欄位名拼寫 | 大小寫敏感(Linux),引用名稱必須精確 |
| 字符集排序 | 兩表 CHARSET/COLLATION 一致 |
SHOW ENGINE INNODB STATUS\G
# 關注 LATEST FOREIGN KEY ERROR 區塊
SHOW CREATE TABLE parent_table\G
SHOW CREATE TABLE child_table\G
# 對比類型、索引、引擎