为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL使用ForeignKeys创建表并给出errno:150

MySQL使用ForeignKeys创建表并给出errno:150

慕田峪4524236 2019-06-03 16:38:54
MySQL使用ForeignKeys创建表并给出errno:150我试图用两个外键在MySQL中创建一个表,这两个外键引用了另外两个表中的主键,但是我得到了一个errno:150错误,它不会创建这个表。以下是所有3个表的SQL:CREATE TABLE role_groups (   `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`,   `name` varchar(20),   `description` varchar(200),   PRIMARY KEY (`role_group_id`)) ENGINE=InnoDB;CREATE TABLE IF NOT EXISTS `roles` (   `role_id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(50),   `description` varchar(200),   PRIMARY KEY (`role_id`)) ENGINE=InnoDB;create table role_map (   `role_map_id` int not null `auto_increment`,   `role_id` int not null,   `role_group_id` int not null,   primary key(`role_map_id`),   foreign key(`role_id`) references roles(`role_id`),   foreign key(`role_group_id`) references role_groups(`role_group_id`)) engine=InnoDB;任何帮助都将不胜感激。
查看完整描述

4 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

MySQL通用的“errno 150”消息表示未正确形成外键约束。“正如您可能已经知道的,如果您正在阅读此页面,一般的“errno:150”错误消息实际上是没有帮助的。然而:

你可以得到实际通过运行错误消息SHOW ENGINE INNODB STATUS;然后寻找LATEST FOREIGN KEY ERROR在输出中。

例如,试图创建外键约束:

CREATE TABLE t1(id INTEGER);CREATE TABLE t2(t1_id INTEGER,
 CONSTRAINT FOREIGN KEY (t1_id) REFERENCES t1 (id));

错误失败Can't create table 'test.t2' (errno: 150)..这不会告诉任何人任何有用的东西,除了这是一个外键问题。但是跑SHOW ENGINE INNODB STATUS;它会说:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130811 23:36:38 Error in foreign key constraint of table test/t2:
FOREIGN KEY (t1_id) REFERENCES t1 (id)):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

它说问题在于它找不到索引。SHOW INDEX FROM t1显示表中根本没有索引。t1..通过,比如说,定义主键来解决这个问题。t1,将成功创建外键约束。


查看完整回答
反对 回复 2019-06-03
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

确保您试图使用约束链接的两个字段的属性完全相同。

通常,ID列上的“unsigned”属性会捕获您。

ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;


查看完整回答
反对 回复 2019-06-03
?
桃花长相依

TA贡献1860条经验 获得超8个赞

运行此脚本时,数据库的当前状态如何?完全是空的吗?在从头创建数据库时,您的SQL运行良好,但errno 150通常与删除和重新创建作为外键一部分的表有关。我有种感觉,你不是在用一个100%新鲜的新数据库。

如果您在对SQL文件进行“source”时出错,您应该能够在MySQL提示符“Source”命令之后立即运行命令“Show Engine INNODB Status”,以查看更详细的错误信息。

您可能也需要查看手册条目:

如果您重新创建一个被删除的表,它必须有一个符合引用它的外键约束的定义。如前面所述,它必须具有正确的列名和类型,并且必须在引用的键上有索引。如果不满足这些要求,MySQL将返回错误号1005,并在错误消息中引用错误150。如果MySQL从CREATETABLE语句中报告错误号1005,并且错误消息引用错误150,则表创建失败,因为外键约束没有正确形成。

— MySQL 5.1参考手册.


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 713 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信