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;
我得到以下错误:错误1005(HY000):无法创build表'./test/bar.frm'(errno:150)
****是我的错误? 盯着这半个小时我还没有find他。
从外FOREIGN KEY
约束
如果您重新创build一个被删除的表,它必须有一个符合引用它的外键约束的定义。 它必须具有正确的列名和types,并且必须在引用的键上有索引,如前所述。 如果不满足,MySQL将返回错误号1005,并在错误信息中引用错误150。
我怀疑是因为你没有像InnoDB那样创buildfoo
,因为所有的东西看起来都不错。
编辑:从同一页面 –
这两个表必须是InnoDB表,不能是TEMPORARY表。
您可以使用SHOW ENGINE INNODB STATUS
命令
要创build一个外键,
- 主栏和参考栏都必须有相同的定义。
- 两个表引擎都必须是InnoDB。
你可以用这个命令改变表的引擎,执行这个命令前请备份。
alter table [表名] ENGINE = InnoDB;
我也有同样的问题,对于那些也有这个问题的人:
检查引用表的表名
我在表名的末尾忘记了's'
例如表客户端 – >客户端
🙂
除了许多其他原因,最终导致MySql Error 150(使用InnoDB时),其中一个可能的原因是在表的create语句中包含被引用为相关表中的外键的列名的未定义的KEY
。
让我们说主表的创build语句是 –
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表的创build语法 –
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
表中的master_table
列添加一个KEY
,然后在relative_table
表中引用它作为foreign_key。
最后, master_table
的创build语句将是 –
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;
我有同样的问题,原因是列的“整理”是不同的。 一个是latin1,另一个是utf8
如果在“引用”关键字之后没有给出正确的列名,也可能发生这种情况。