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

MySQL ERROR 1005 (errno: 150) 外鍵建立失敗:原因分析與兩大經典案例

     編輯:MySQL 資料庫相關知識

官方錯誤說明

Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

譯文:在「被參考的表」中找不到包含「被參考欄位」的索引,或兩個關聯欄位型別不匹配。

執行 SHOW ENGINE INNODB STATUS 可查看 LATEST FOREIGN KEY ERROR 詳細資訊。

案例一:欄位型別不匹配

CREATE TABLE booktype (
    btid INT(5) UNSIGNED ZEROFILL AUTO_INCREMENT NOT NULL PRIMARY KEY,
    btname VARCHAR(100) NOT NULL UNIQUE,
    btnote TEXT
);

CREATE TABLE books (
    bid INT(5) UNSIGNED ZEROFILL AUTO_INCREMENT NOT NULL PRIMARY KEY,
    bname CHAR(30) NOT NULL,
    isbn CHAR(50) NOT NULL,
    author CHAR(30) NOT NULL,
    press TEXT,
    summary TEXT,
    bcount INT NOT NULL DEFAULT 0,
    btid INT,  -- 此處型別缺少 UNSIGNED ZEROFILL
    FOREIGN KEY (btid) REFERENCES booktype(btid)
);

錯誤: ERROR 1005 (HY000): Can't create table '.\bookdata\books.frm' (errno: 150)

解決: 將 books.btid 定義為 INT(5) UNSIGNED ZEROFILL,與 booktype.btid 完全一致。

案例二:缺少索引與表引擎不支援

CREATE TABLE products (
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    description TEXT NOT NULL,
    image_url VARCHAR(200) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    date_available DATETIME NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE line_items (
    id INT NOT NULL AUTO_INCREMENT,
    product_id INT NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    unit_price DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_items_product FOREIGN KEY (product_id) REFERENCES products(id),  -- 此處拼寫錯誤 producets
    INDEX (product_id),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

問題:

  1. 參考表名拼寫錯誤:producets 應為 products
  2. 被參考欄位 products.id 已為主鍵(含索引),但 line_items.product_id 需顯式建立 INDEX(已做)
  3. 兩表必須均為 InnoDB 引擎(已滿足)

關鍵原則:

  • 外鍵要求表引擎為 InnoDB
  • 關聯欄位型別、長度、屬性(UNSIGNED/ZEROFILL)必須完全一致
  • 被參考欄位必須有索引(主鍵、唯一鍵或普通索引)
  • 參考表名拼寫正確
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved