MySql错误150 - 外键

时间:2009-05-05 15:14:50

标签: mysql foreign-keys mysql-error-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'(错误号:150)

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

7 个答案:

答案 0 :(得分:30)

来自FOREIGN KEY Constraints

  

如果你重新创建一个表   掉线了,它必须有一个定义   符合外键   引用它的约束。它必须   拥有正确的列名称和类型,   它必须有索引   如前所述,引用的密钥。如果   这些都不满意,MySQL返回   错误号1005并指错误   150错误信息。

怀疑是因为你没有创建foo作为InnoDB,因为其他一切看起来还不错。

编辑:来自同一页面 -

  

两个表都必须是InnoDB表,它们不能是TEMPORARY表。

答案 1 :(得分:11)

您可以使用命令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'.

答案 2 :(得分:4)

要创建外键,

  1. 主列和参考列必须具有相同的定义。
  2. 两个表引擎必须是InnoDB。
  3. 您可以使用此命令更改表的引擎,请在执行此命令之前执行备份。

    alter table [table name] ENGINE = InnoDB;

答案 3 :(得分:1)

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

检查引用表的表名

我忘记了表格末尾的's'

例如table Client - >客户端

:)

答案 4 :(得分:1)

除了形成MySql Error 150(使用InnoDB时)的许多其他原因外,其中一个可能的原因是表的create语句中的未定义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语法,其中外键约束是从主表 -

设置的

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结束。

要解决此问题,我们需要为KEY表中的列record_id添加master_table,然后在relative_table表中引用以用作foreign_key。

最后,master_table的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'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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