除了形成许多其他原因与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