「ERROR 1005 (HY000): Can't create table ... (errno: 150)」是 MySQL 外鍵建立最常見也最讓人崩潰的錯誤。錯誤訊息極不友善,實際上多為元數據不匹配導致。本文彙總 10 大高發原因並按概率排序,助你精準定位、一擊必中。
INT(10) UNSIGNED,子表必須完全一致,INT(11) 或 TINYINT 皆會報 150。需用 SHOW COLUMNS 核對,工具顯示的「integer」可能掩蓋細節差異。ON DELETE SET NULL,子表欄位必須允許 NULL。調整 CASCADE 屬性或修改欄位為 NULL。CHARSET、COLLATE 必須完全一致。DEFAULT 0 會干擾外鍵語義,需移除。(a,b),子表只能引用 a 或 (a,b),單獨引用 b 需額外建立單列索引。utf8、一表 latin1,即使欄位類型相同也會報 150。-- 1. 核對引擎
SHOW TABLE STATUS WHERE Name IN ('parent','child');
-- 2. 核對欄位定義
SHOW CREATE TABLE parent;
SHOW CREATE TABLE child;
-- 3. 核對字符集
SHOW TABLE STATUS LIKE 'parent'\G
SHOW TABLE STATUS LIKE 'child'\G
-- 4. 確認父表索引
SHOW INDEX FROM parent;
逐項核對通常能在 5 分鐘內定位問題。記住:errno 150 幾乎從不代表權限或 OS 錯誤,純屬元數據不匹配。