除了许多其他原因导致使用InnoDB时出现MySql错误150之外,可能的一个原因是在包含作为相对表中外键引用的列名的表的创建语句中未定义“KEY”。
假设主表的创建语句如下:
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;
相对表的创建语法如下,其中设置了外键约束:
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
表中的列record_id
中添加一个KEY
,然后在relative_table
表中引用它作为外键。
最终,master_table
的创建语句将为-
创建'master_table'表(
'id' 整型(10) 非空 自动增量,
'record_id' 字符型(10) 非空,
'name' 变长字符型(50) 非空 默认值为空字符串,
'address' 变长字符型(200) 非空 默认值为空字符串,
主键为'id',
索引 'record_id' ('record_id')
) 引擎为InnoDB 默认字符集为utf8;
foo
,并使用InnoDB创建一个bar
,这表明情况确实如此 - 请仔细检查foo
的表类型。 - Rob