除了形成許多其他原因與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;
快速測試的位,創造了'foo`如上面的MyISAM和`bar`與InnoDB的,建議是這樣的話 - 儘量仔細檢查了`foo`你的表型。 – Rob 2009-05-05 15:26:52
對於「兩個表都必須是InnoDB表」+1,非常感謝! – sanbhat 2013-03-04 11:00:21
即使這兩個表都是InnoDB,我仍然遇到同樣的問題。我通過在創建外鍵之前在引用表上創建索引來修復它。 – IROEGBU 2013-09-04 17:29:51