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

MySQL 外鍵建表錯誤 1005 (errno: 121/150) 根因與解決對照表

     編輯:MySQL 資料庫相關知識

錯誤 1005 (errno: 150) - 關聯欄位定義不一致

核心原因:父表主鍵與子表外鍵欄位在資料類型、長度、符號位、字符集、校對規則任一維度不完全一致。

  • INT vs BIGINT、SMALLINT vs MEDIUMINT。
  • UNSIGNED vs 有符號。
  • CHAR(10) vs VARCHAR(10)、字符集 utf8 vs utf8mb4、校對 utf8_general_ci vs utf8_bin。
  • 父表欄位無索引(必須是索引首欄)。

檢查清單:SHOW CREATE TABLE parent\G、SHOW CREATE TABLE child\G 逐欄對照。

錯誤 1005 (errno: 121) - 外鍵名稱衝突

外鍵名稱在同一資料庫內必須唯一,即使屬不同表。
解決:顯式命名 CONSTRAINT fk_unique_name FOREIGN KEY ...,避免自動生成重複。

外鍵建立前置條件

  1. 父表引用欄位必須有索引(主鍵/唯一/普通索引首欄)。
  2. 雙表引擎均為 InnoDB(MyISAM 不支援外鍵)。
  3. 資料類型、長度、字符集、校對規則、符號位完全一致。
  4. 父表已存在的資料需滿足引用完整性(或先清空子表)。

診斷利器:SHOW ENGINE INNODB STATUS

報錯後立即執行,查看 LATEST FOREIGN KEY ERROR 區塊,包含具體不匹配欄位與建議修正方案。

避坑最佳實踐

  • 使用遷移工具(Flyway/Liquibase)管理 DDL,版本控制外鍵命名。
  • 資料庫設計階段統一「外鍵欄位模板」:BIGINT UNSIGNED NOT NULL 等。
  • 高併發核心鏈路考慮應用層維護完整性,資料庫層關閉外鍵檢查(SET FOREIGN_KEY_CHECKS=0)提升寫入效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved