mysql创建带有外键的表,给出errno:150

tzcvj98z  于 2021-06-18  发布在  Mysql
关注(0)|答案(20)|浏览(500)

我试图在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;

任何帮助都将不胜感激。

frebpwbc

frebpwbc16#

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 ,并且将成功创建外键约束。

lrpiutwd

lrpiutwd17#

请先确认一下
您正在使用innodb表。
外键的字段具有相同的类型和长度(!)作为源字段。
我也有同样的问题,我已经解决了。一个字段有无符号int,另一个字段只有整数。

uklbhaso

uklbhaso18#

当您试图将源文件导入现有数据库时,通常会发生这种情况。首先删除所有表(或数据库本身)。然后是源文件 SET foreign_key_checks = 0; 开始和结束时 SET foreign_key_checks = 1; 最后。

wbrvyc0a

wbrvyc0a19#

在我的例子中,这是因为外键字段的名称太长。 foreign key (some_other_table_with_long_name_id) . 试试短一点的。在这种情况下,错误消息有点误导。
另外,正如@jon前面提到的,字段定义必须相同(注意 unsigned 子类型)。

hmae6n7t

hmae6n7t20#

在创建表之前执行以下行:设置外键检查=0;
foreign\u key\u checks选项指定是否检查innodb表的外键约束。
--指定以检查外键约束(这是默认设置)

SET FOREIGN_KEY_CHECKS = 1;

 
--不检查外键约束
设置外键检查=0;
何时使用:当您需要重新创建表并以任何父子顺序加载数据时,临时禁用引用约束(将foreign\u key\u checks设置为0)非常有用

相关问题