MySQL的。无法创建表格errno 150


68

我必须在MySQL中创建一个包含两个表的数据库,但是该脚本因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进行了尝试,但无法正常工作。

有任何想法吗?


9
我还通过尝试创建对另一个尚不存在FK约束的表而收到此错误。这是一个容易解决的问题,由于完全无用的错误消息而变得非常困难。
塞林2012年

2
对于那些从Google到这里的人来说,如果您在外键的表名上输入错误,也会发生此错误。
Dave C

Answers:


54

table1.field1 没有定义索引。

需要对施加FOREIGN KEY约束field1

有了这个:

 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;

然后一切都会按预期工作。


18
尽管在这种情况下它不适用,但是如果您尝试添加外键约束并且将delete设置为不可为null的列,则您将收到相同的错误消息。
约翰·祖布鲁姆

49

在使用MySQL Workbench和MySQL 5.5.27时,我遇到了类似的问题。就我而言,问题是INT类型字段。错误地在一个表中是INT UNSIGNED,而在引用表中是INT。


11
这正是我的问题。谢谢!
RJ Spiker

13

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


8

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

  • 引用的主键和引用的外键之间的数据类型不匹配
  • 指标。您索引的任何外键都不能为空

NOT NULL参数不适用于Mysql 5.5
e2-e4,2016年

6

另一个提示:

即使您的数据类型似乎相同(在我的情况下,两列都相同),VARCHAR(50)这还是不够的。

您还需要确保两个列都相同COLLATION


5

另一个原因,尽管与其他原因略有相似:我指的是一个表,该表原来具有MyISAM引擎,而不是InnoDB。


5

如果您错误地引用了引用表的名称,MySQL也会抛出此错误。我抽了一段时间,直到我发现我错过了一封信foreign key (column1) references mistyped_table(column1)


在某些情况下,(表名的)大小写很重要-在某些情况下不重要。例如,我的脚本在OSX上的mysql上运行,但是在linux上,我遇到了errno:150问题。案件是我的问题。
预定义规则

同样,我也有FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE,但是user表没有字段id-它被称为user_id!因此,在上面我更改user(id)user(user_id),现在宇宙又恢复了……。
elimisteve

5

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

SET FOREIGN_KEY_CHECKS = 0;

1

如果没有任何效果,请尝试以下操作:

外键名称是已存在键的重复。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加一些随机字符即可对此进行测试。



0

在我的情况下,一个表在另一个尚不存在的表上使用外键约束。这是由于Makefile很大而发生的,所以它并不像我期望的那么明显。


0

万一有人仍然对此有疑问,我尝试了上述所有解决方案(SET FOREIGN_KEY_CHECKS除外),但没有任何效果。问题是,当您引用第一个表时,某些数据库对表名区分大小写。我认为这很奇怪,因为我以前从未在MySQL和Oracle上看到过这种情况,现在在MariaDB上发生了这种情况。

例如:

如果不存在则创建表CADASTRO_MAQUINAS(Id VARCHAR(16),Primary Key(Id));

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

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


0

我正在使用MySQL workBench。问题是您不能使用相同的东西foreign key name,而必须使用相同的东西unique。因此,如果多个表将引用相同的外键,则每次都必须指定一个unique名称。


0

我的一张桌子上也有类似的错误。如果选中了“列排序规则”,则该排序规则会不同,一旦工作,将两列更改为同一排序规则类型。

在阅读了大多数建议的解决方案之后。我只是认为如果我列出所有可能引发此错误的可能性,可能会有所帮助。

1,检查列的大小写2,检查列的集合3,检查两个表中是否都为该列创建了键(唯一,主)


0

在我的情况下,我在其中一个表中获得了旧表定义MyISAM,显然我无法从另一个表中为其创建外键。也许这可以帮助某人。

因此,可能由于两个数据库/字段定义之间的不一致而导致发生这种情况:

Field Type
Field Collation
Table Engine


0

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

例如:

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

在这种情况下,重要的是,以与出现在项目表PRIMARY KEY定义中相同的顺序使用FK定义中的article_id和type字段。


0

就我而言,可能是服务器错误导致删除了具有相同名称的表。删除整个shcema,然后重新创建即可解决该问题。


0

在非常奇怪的情况下,您的数据库可能已损坏。就我而言,我在表上没有任何外键,唯一重命名表或更改引擎的方法是有帮助的。

原来innoDB已损坏,请参阅:https ://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to- a?lq = 1


0

如果您正在使用mysql工作台,并且在关系表中遇到此错误,则可能会为您快速解决:只需删除它,然后让mysql工作台为您重新创建它。然后复制sql。修复了我的errno 150问题。


0

当我遇到这个问题时,这是因为我将第一个表中的id设置为,unsigned而第二个表中的外键则没有。让他们俩都unsigned为我修复了它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.