MySQL的外键创建表errno:150?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (172)

我想在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;

能帮助一下我吗?

提问于
用户回答回答于

你可以通过运行,SHOW ENGINE INNODB STATUS;LATEST FOREIGN KEY ERROR

然后在输出中查找实际的错误消息。

用户回答回答于

150错误造成原因分析:

  1. 这两个表必须具有相同的引擎,引擎必须支持外键。例如ENGINE=InnoDB。其他存储引擎默默地忽略外键定义,所以它们不会返回错误或警告,但FK约束不会被保存。
  2. 父表中引用的列必须是密钥的最左边的列。最好,如果关键是PRIMARY KEYUNIQUE KEY
  3. FK定义必须以与PK定义相同的顺序引用PK列。例如,如果FK,REFERENCES Parent(a,b,c)那么父母的PK不能在列上按顺序定义(a,c,b)
  4. Parent表中的PK列必须与Child表中的FK列的数据类型相同。例如,如果Parent表中的PK列是UNSIGNED,请确保为UNSIGNEDChild表字段中的相应列定义。 例外:字符串的长度可能不同。例如,VARCHAR(10)可以参考VARCHAR(20),反之亦然。
  5. 任何字符串类型的FK列必须与相应的PK列具有相同的字符集和归类。
  6. 如果Child表中已有数据,则FK列中的每个值都必须与父表PK列中的值相匹配。用下面的查询来检查: SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK WHERE Parent.PK IS NULL; 这必须返回零(0)不匹配的值。显然,这个查询是一个通用的例子。你必须替换你的表名和列名。
  7. 父表和子表都不能成为TEMPORARY表。
  8. 父表和子表都不能成为PARTITIONED表。

希望这可以帮助。

扫码关注云+社区

领取腾讯云代金券