18

当我执行以下两个查询时(我已将它们剥离为绝对必要的):

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): Can't create table './test/bar.frm' (errno: 150)

我的错误在哪里?我盯着这个看了半个小时都没找到他。

4

7 回答 7

31

FOREIGN KEY约束

如果您重新创建已删除的表,则它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果这些不满足,MySQL 返回错误号 1005 并在错误消息中引用错误 150。

怀疑这是因为您没有创建foo为 InnoDB,因为其他一切看起来都不错。

编辑:来自同一页面 -

两个表都必须是 InnoDB 表,并且不能是 TEMPORARY 表。

于 2009-05-05T15:22:11.423 回答
12

您可以使用该命令SHOW ENGINE INNODB STATUS获取有关错误的更具体信息。

它会给你一个Status包含大量文本的列的结果。

查找名为 LATEST FOREIGN KEY ERROR 的部分,例如可能如下所示:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create  table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
于 2013-10-22T14:37:27.837 回答
4

要创建外键,

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

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

改变表 [表名] ENGINE=InnoDB;

于 2014-01-14T10:49:10.760 回答
1

我有同样的问题,对于那些也有这个问题的人:

检查引用表的表名

我忘记了表名末尾的“s”

例如表客户端-> 客户端

:)

于 2013-01-21T18:51:43.853 回答
1

除了导致 MySql 错误 150 (使用 InnoDB 时)的许多其他原因之外,可能的原因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;

以及从主表设置外键约束的 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 错误 150 结束。

为了解决这个问题,我们需要为表KEY中的列添加一个然后在表中引用record_id以用作foreign_key。master_tablerelative_table

最后, , 的创建语句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;

于 2013-11-21T10:15:48.670 回答
0

我遇到了同样的问题,原因是列的“整理”不同。一个是 latin1 而另一个是 utf8

于 2013-08-07T11:01:11.977 回答
0

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

于 2015-09-08T12:00:58.670 回答