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一个外键,

  1. 主栏和参考栏都必须有相同的定义。
  2. 两个表引擎都必须是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

如果在“引用”关键字之后没有给出正确的列名,也可能发生这种情况。