MySql错误150 - 外键
-
05-07-2019 - |
题
当我执行以下两个查询时(我已将它们剥离到绝对必要):
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)
****是我的错误?我盯着这个半小时没找到他。
解决方案
如果你重新创建一个表 掉线了,它必须有一个定义 符合外键 引用它的约束。它必须 拥有正确的列名称和类型, 它必须有索引 如前所述,引用的密钥。如果 这些都不满意,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'.
要创建外键,
- 主列和参考列必须具有相同的定义。
- 两个表引擎必须是InnoDB。 醇>
您可以使用此命令更改表的引擎,请在执行此命令之前执行备份。
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
如果在“引用”之后没有给出正确的列名,也可能发生这种情况。关键字。