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
名称。
我的桌子上有一个类似的错误。 当检查列Collation是不同的,工作曾经改变了两列到相同的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问题。
尝试使用外键引用非唯一字段时出现此错误。 (这显然是不允许的)