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

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)

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

有帮助吗?

解决方案

来自 FOREIGN KEY 约束

  

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

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

编辑:来自同一页面 -

  

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

其他提示

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

要创建外键,

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

    alter table [table name] ENGINE = InnoDB;

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

检查引用表的表名

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

例如table Client - >客户端

:)

除了形成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'allative_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 表中的 record_id 列添加 KEY ,然后在 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;

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top