Mysql的。 无法创build表errno 150

我必须在MySQL中创build一个带有2个表的数据库,但脚本失败,出现errno 150(外键问题)。 我仔细检查了两个表上的外键字段是相同的,我找不到任何错误。

这是脚本:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; DROP SCHEMA IF EXISTS `testdb`; CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; USE `testdb`; DROP TABLE IF EXISTS `testdb`.`table1` ; CREATE TABLE IF NOT EXISTS `testdb`.`table1` ( `id` INT UNSIGNED NOT NULL , `field1` VARCHAR(50) NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; DROP TABLE IF EXISTS `testdb`.`table2` ; CREATE TABLE IF NOT EXISTS `testdb`.`table2` ( `id` INT NOT NULL AUTO_INCREMENT , `field1` VARCHAR(50) NULL , `date` DATE NULL , `cnt` INT NULL , PRIMARY KEY (`id`) , INDEX `FK_table2_table1` (`field1` ASC) , CONSTRAINT `FK_table2_table1` FOREIGN KEY (`field1`) REFERENCES `testdb`.`table1` (`field1` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 

我已经在Windows和Ubuntu中使用不同版本的Mysql进行了尝试,并没有工作。

有任何想法吗? 非常感谢。

table1.field1没有定义索引。

需要在field1上放置一个FOREIGN KEY约束。

有了这个:

  CREATE TABLE IF NOT EXISTS `testdb`.`table1` ( `id` INT UNSIGNED NOT NULL , `field1` VARCHAR(50) NULL , KEY ix_table1_field1 (field1), PRIMARY KEY (`id`) ) ENGINE = InnoDB; 

一切都应该按预期工作。

在使用MySQL Workbench和MySQL 5.5.27时,我遇到了类似的问题。 在我的情况下问题是与INTtypes的字段。 错误地在一个表中是INT UNSIGNED,在引用表中是INT。

根据MySQL的版本,您可能需要首先在table1.field1上创build一个索引。

其中一个答案build议禁用外键完整性检查。 这是一个坏主意。 这里有两个可能的罪魁祸首:

  • 引用的主键和引用外键之间的数据types不匹配
  • 指数。 你索引的任何外键都必须是NOT NULL

另一个提示:

即使你的数据types看起来相同 – 在我的情况下,两列都有VARCHAR(50) – 这还不够。

您还需要确保两列具有相同的COLLATION

一个选项(取决于大小写)将禁用mysql完整性检查:

 SET FOREIGN_KEY_CHECKS = 0; 

还有另一个原因,尽pipe与其他原因略有相似:我所指的是一张表,后来竟然有了MyISAM引擎,而不是InnoDB。

如果你误导引用表的名字,MySQL也会抛出这个错误。 我把头发拉出来一会儿,直到我意识到我错过了一个foreign key (column1) references mistyped_table(column1)

如果没有任何工作,试试这个:

外键名称是已有键的副本。 检查您的外键的名称在数据库中是唯一的。 只需在您的密钥名称的末尾添加几个随机字符即可testing。

总是先创build主/父表,然后创build你的详细/子表。

在我的情况下,一个表在另外一个不存在的表上使用外键约束。 这是由于一个大的makefile,所以没有我所预期的那么明显。

如果有人仍然有这个问题,我尝试了上面的所有解决scheme(SET FOREIGN_KEY_CHECKS除外),没有任何工作。 问题是,当您引用第一个表时,一些数据库对表名称是区分大小写的。 我觉得这很奇怪,因为我从来没有在MySQL,Oracle上看到过这个,现在MariaDB上发生了这种情况。

例如:

创build表(如果不存在)CADASTRO_MAQUINAS(Id VARCHAR(16),主键(Id));

如果不存在,则创build表INFOS(Id_Maquina VARCHAR(16)NOT NULL,CONSTRAINT FK_infos_cadastro_maquinas外键(Id_Maquina)引用CADASTRO_MAQUINAS(Id));

如果我尝试使用cadastro_maquinas(小写)而不是CADASTRO_MAQUINAS创build第二个表格,则会收到此错误。

我正在使用MySQL workBench 。 这个问题是你不能使用相同的foreign key name ,他们需要是unique 。 因此,如果多个表将引用相同的外键,则每次必须给定unique名称。

我的桌子上有一个类似的错误。 当检查列Collat​​ion是不同的,工作曾经改变了两列到相同的sortingtypes。

在阅读大部分build议的解决scheme后。 我只是想,如果我列出所有可能引发这个错误的可能性,这可能会有所帮助。

1,检查第二列的CASE,检查第三列的COLLATION,检查是否在这两个表中为列创build了一个键(Unique,Primary)

在我的情况下,我在一个表中得到旧的表定义MyISAM,显然我无法从另一个表中创build外键。 也许这有助于某人。

所以这可能是因为两个数据库/字段定义之间的不一致而导致的:

 Field Type Field Collation Table Engine 

对我来说,问题是在CREATE TABLE查询中使用CONSTRAINT

尝试引用外键中的复合键时,您也可能会遇到相同的错误。

例如:

 CREATE TABLE `article` ( `id` int(10) unsigned NOT NULL, `type` enum('X','Y','Z') NOT NULL, PRIMARY KEY (`id`,`type`) ) ENGINE InnoDB; CREATE TABLE `t1` ( `user_id` int(10) unsigned NOT NULL, `type` enum('X','Y','Z') NOT NULL, `article_id` int(10) unsigned NOT NULL, CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB 

在这种情况下,在FK定义中使用article_id和type字段的顺序与它们在文章表PRIMARY KEY定义中出现的顺序非常重要。

在我的情况下,可能是一个服务器错误删除一个同名的表。 丢弃整个shcema并重新创build它解决了这个问题。

在非常奇怪的情况下,你的数据库可能被破坏 在我的情况下,我没有在桌子上的任何外键,唯一重命名表或改变引擎帮助。

原来innoDB坏了,请看: https ://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to- 一个?LQ = 1

如果您正在使用mysql工作台,并且您得到关系表的这个错误,那么您可能会很快find一个解决方法:只需将其删除,然后让mysql工作台为您重新创build它。 然后复制sql。 修正了我的errno 150问题。

尝试使用外键引用非唯一字段时出现此错误。 (这显然是不允许的)