首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 外鍵建立失敗 errno:150 完整排查清單:10 大核心原因與解決方案

     編輯:MySQL 資料庫相關知識

「ERROR 1005 (HY000): Can't create table ... (errno: 150)」是 MySQL 外鍵建立最常見也最讓人崩潰的錯誤。錯誤訊息極不友善,實際上多為元數據不匹配導致。本文彙總 10 大高發原因並按概率排序,助你精準定位、一擊必中。

10 大核心原因排查清單(按高發概率排序)

  1. 欄位類型/長度/符號位不嚴格匹配
    父表 INT(10) UNSIGNED,子表必須完全一致,INT(11) 或 TINYINT 皆會報 150。需用 SHOW COLUMNS 核對,工具顯示的「integer」可能掩蓋細節差異。
  2. 被引用欄位無索引或非主鍵
    父表欄位必須為 PRIMARY KEY 或擁有獨立 INDEX。MyISAM 表不支援外鍵,必須為 InnoDB。
  3. 外鍵名稱衝突
    外鍵名稱在資料庫級必須唯一。嘗試在名稱後加隨機後綴測試。
  4. 表引擎不一致(含 MyISAM)
    任一表為 MyISAM 即不支援外鍵約束(雙 MyISAM 不報錯但不生效)。必須雙雙為 InnoDB。
  5. ON DELETE SET NULL 與 NOT NULL 衝突
    若定義 ON DELETE SET NULL,子表欄位必須允許 NULL。調整 CASCADE 屬性或修改欄位為 NULL。
  6. 字符集/排序規則不一致
    表級與欄位級的 CHARSET、COLLATE 必須完全一致。
  7. 外鍵欄位設有 DEFAULT 值
    如 DEFAULT 0 會干擾外鍵語義,需移除。
  8. 引用的是複合索引中的非最左列
    若父表複合索引為 (a,b),子表只能引用 a 或 (a,b),單獨引用 b 需額外建立單列索引。
  9. ALTER TABLE 語法錯誤
    檢查引號、反引號、逗號等語法細節。
  10. 兩表編碼格式不同
    如一表 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 錯誤,純屬元數據不匹配。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved