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

MySQL 添加外鍵報錯 ERROR 150 九大原因排查與解決方案 MySQL 添加外鍵報錯 ERROR 150 九大原因排查與解決方案

     編輯:MySQL 資料庫相關知識

錯誤現象

ERROR 1005 (HY000): Can't create table '...' (errno: 150) —— 經典外鍵創建失敗錯誤,官方文檔提示不夠明確,實際多為元數據不匹配。

九大已知原因(按可能性排序)

  1. 列類型/長度不嚴格匹配: 如 INT(10) vs INT(11)、TINYINT vs INT、SIGNED vs UNSIGNED。
    **排查:** SHOW COLUMNS FROM tbl 核對,GUI 工具可能隱藏長度差異。
  2. 被引用列無索引/非主鍵: 外鍵列必須有索引(主鍵自動有)。
    **解決:** CREATE INDEX idx_col ON parent_tbl(col);
  3. 外鍵名稱衝突: 數據庫級別外鍵名必須唯一。
    **解決:** 手動指定唯一名 CONSTRAINT fk_unique_name FOREIGN KEY ...
  4. 表引擎非 InnoDB: MyISAM 不支持外鍵約束(雙方均為 MyISAM 時不報錯但不生效)。
    **解決:** ALTER TABLE tbl ENGINE=InnoDB;
  5. ON DELETE SET NULL 但列定義 NOT NULL: 衝突。
    **解決:** 改 ON DELETE CASCADE 或列允許 NULL。
  6. 字符集/校驗規則不一致: 表級、列級 CHARSET/COLLATE 必須完全一致。
    **解決:** 統一指定 CHARSET=utf8 COLLATE=utf8_general_ci。
  7. 外鍵列設置了默認值(如 DEFAULT 0): 可能干擾。
    **解決:** 移除默認值。
  8. 引用列是組合索引前綴但無獨立索引: 如 INDEX(a,b) 只引用 b。
    **解決:** 為該列單獨建索引。
  9. ALTER 語法錯誤: 如缺少 REFERENCES、括號不匹配等。

用戶補充高發原因

  • 引用類型不一致:主鍵 INT,外鍵 CHAR
  • 找不到主表引用列(拼寫錯誤、大小寫敏感)
  • 主鍵/外鍵字符編碼不一致
  • **未先建立索引**

實戰解決模板


ALTER TABLE child_tbl
ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id) REFERENCES parent_tbl(id)
ON DELETE CASCADE ON UPDATE CASCADE
ENGINE=INNODB DEFAULT CHARSET=utf8;

關鍵點:

  • 顯式指定 ENGINE=INNODB
  • 顯式指定 DEFAULT CHARSET=utf8(與主表一致)
  • 主表被引用列必須有索引(主鍵或單獨索引)
  • 類型、長度、符號位、字符集**逐項核對**

排查清單

  1. SHOW CREATE TABLE parent_tbl; SHOW CREATE TABLE child_tbl; 對比
  2. 確認兩表均為 ENGINE=InnoDB
  3. 確認 CHARSET/COLLATE 完全一致
  4. 確認被引用列有索引
  5. 確認數據類型、長度、符號位完全一致
  6. 確認無默認值衝突
  7. 確認外鍵名唯一
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved