2009-05-05 93 views
16

当我执行在以下两个查询(我已经剥离下来,绝对必要):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; 

我得到以下错误: ERROR 1005(HY000):不能创建表'./test/bar.frm'(errno:150)

****是我的错误?我在盯着这半个小时的时候还没有找到他。

回答

29

FOREIGN KEY Constraints

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

怀疑是,那是因为你没有创建foo为InnoDB的,因为一切看起来不错。

编辑:在同一页面 -

Both tables must be InnoDB tables and they must not be TEMPORARY tables.

+0

快速测试的位,创造了'foo`如上面的MyISAM和`bar`与InnoDB的,建议是这样的话 - 尽量仔细检查了`foo`你的表型。 – Rob 2009-05-05 15:26:52

+0

对于“两个表都必须是InnoDB表”+1,非常感谢! – sanbhat 2013-03-04 11:00:21

+1

即使这两个表都是InnoDB,我仍然遇到同样的问题。我通过在创建外键之前在引用表上创建索引来修复它。 – IROEGBU 2013-09-04 17:29:51

1

我有同样的问题,对于那些谁是有,这也:

检查引用的表

我的表名在我的表名末尾忘记's'

例如表客户端 - >客户端

:)

0

我有非常相同的问题,原因是列的“整理”是不同的。一个是latin1的,而另一个是UTF8

9

您可以使用命令SHOW ENGINE INNODB STATUS

1

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

4

要创建一个外键,

  1. 两个主塔和参考列必须有相同的定义。
  2. 两个表引擎必须是InnoDB。

您可以使用此命令更改表的引擎,请在执行此命令之前进行备份。

ALTER TABLE [表名] ENGINE = InnoDB的;

0

这也可能发生,如果你没有给后“引用”关键字正确的列名。