我试图在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;
任何帮助都将不胜感激。
20条答案
按热度按时间frebpwbc16#
mysql的通用“errno:150”消息“意味着外键约束的格式不正确”,正如您可能已经知道的,如果您正在阅读此页,那么通用的“errno:150”错误消息确实没有帮助。然而:
您可以通过运行
SHOW ENGINE INNODB STATUS;
然后寻找LATEST FOREIGN KEY ERROR
在输出中。例如,尝试创建外键约束:
失败并出现错误
Can't create table 'test.t2' (errno: 150)
. 除了这是一个外键问题之外,这并不能告诉任何人任何有用的东西。但是快跑SHOW ENGINE INNODB STATUS;
它会说:它说问题是找不到索引。
SHOW INDEX FROM t1
显示表中根本没有任何索引t1
. 例如,通过在上定义主键来解决这个问题t1
,并且将成功创建外键约束。lrpiutwd17#
请先确认一下
您正在使用innodb表。
外键的字段具有相同的类型和长度(!)作为源字段。
我也有同样的问题,我已经解决了。一个字段有无符号int,另一个字段只有整数。
uklbhaso18#
当您试图将源文件导入现有数据库时,通常会发生这种情况。首先删除所有表(或数据库本身)。然后是源文件
SET foreign_key_checks = 0;
开始和结束时SET foreign_key_checks = 1;
最后。wbrvyc0a19#
在我的例子中,这是因为外键字段的名称太长。
foreign key (some_other_table_with_long_name_id)
. 试试短一点的。在这种情况下,错误消息有点误导。另外,正如@jon前面提到的,字段定义必须相同(注意
unsigned
子类型)。hmae6n7t20#
在创建表之前执行以下行:设置外键检查=0;
foreign\u key\u checks选项指定是否检查innodb表的外键约束。
--指定以检查外键约束(这是默认设置)
--不检查外键约束
设置外键检查=0;
何时使用:当您需要重新创建表并以任何父子顺序加载数据时,临时禁用引用约束(将foreign\u key\u checks设置为0)非常有用