2009-05-05 98 views
16

當我執行在以下兩個查詢(我已經剝離下來,絕對必要):MySQL錯誤150 - 外鍵

mysql> CREATE TABLE foo(id INT PRIMARY KEY); 
Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE bar (id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB; 

我得到以下錯誤: ERROR 1005(HY000):不能創建表'./test/bar.frm'(errno:150)

****是我的錯誤?我在盯着這半個小時的時候還沒有找到他。

回答

29

FOREIGN KEY Constraints

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

懷疑是,那是因爲你沒有創建foo爲InnoDB的,因爲一切看起來不錯。

編輯:在同一頁面 -

Both tables must be InnoDB tables and they must not be TEMPORARY tables.

+0

快速測試的位,創造了'foo`如上面的MyISAM和`bar`與InnoDB的,建議是這樣的話 - 儘量仔細檢查了`foo`你的表型。 – Rob 2009-05-05 15:26:52

+0

對於「兩個表都必須是InnoDB表」+1,非常感謝! – sanbhat 2013-03-04 11:00:21

+1

即使這兩個表都是InnoDB,我仍然遇到同樣的問題。我通過在創建外鍵之前在引用表上創建索引來修復它。 – IROEGBU 2013-09-04 17:29:51

1

我有同樣的問題,對於那些誰是有,這也:

檢查引用的表

我的表名在我的表名末尾忘記's'

例如表客戶端 - >客戶端

:)

0

我有非常相同的問題,原因是列的「整理」是不同的。一個是latin1的,而另一個是UTF8

9

您可以使用命令SHOW ENGINE INNODB STATUS

1

除了形成許多其他原因與MySQL錯誤150落得(同時使用InnoDB的),其中一個可能的原因,是不確定的KEY在包含被引用爲相關表中的外鍵的列名稱的表的create語句中。

比方說,創建主表的語句是 -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以及其中外鍵約束從主表設置relative_table表的創建語法 -

CREATE TABLE 'relative_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'salary' int(10) NOT NULL DEFAULT '',
 'grade' char(2) NOT NULL DEFAULT '',
 'record_id' char(10) DEFAULT NULL,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果使用InnoDB,這個腳本肯定會以MySql Error 150結束。

爲了解決這個問題,我們需要在master_table表中添加KEY爲列record_id然後在relative_table表參考被用作foreign_key。

最後,爲master_table創建語句,將是 -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4

要創建一個外鍵,

  1. 兩個主塔和參考列必須有相同的定義。
  2. 兩個表引擎必須是InnoDB。

您可以使用此命令更改表的引擎,請在執行此命令之前進行備份。

ALTER TABLE [表名] ENGINE = InnoDB的;

0

這也可能發生,如果你沒有給後「引用」關鍵字正確的列名。