Mysql的.无法创建表errno 150

Dav*_*art 68 mysql mysql-error-1005

我必须在mysql中创建一个包含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;
Run Code Online (Sandbox Code Playgroud)

我已经在Windows和Ubuntu中尝试了不同版本的Mysql并且无法正常工作.

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

Qua*_*noi 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;
Run Code Online (Sandbox Code Playgroud)

然后一切都应该按预期工作.

  • 虽然在这种情况下不适用,但是如果尝试添加外键约束并且对于非可空列的delete set设置为null,则会收到相同的错误消息. (18认同)
  • 根据手册,它不需要是独一无二的. (5认同)

小智 49

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

  • 这正是我的问题.谢谢! (11认同)

ato*_*ice 13

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


小智 8

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

  • 引用的主键和引用外键之间的数据类型不匹配
  • 指数.您索引的任何外键都必须为NOT NULL


小智 6

另一个暗示:

即使你的数据类型看起来是相同的 - 在我的情况下两列都有VARCHAR(50)- 这还不够.

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


pl1*_*1nk 5

一个选项(取决于具体情况)将禁用mysql完整性检查:

SET FOREIGN_KEY_CHECKS = 0;
Run Code Online (Sandbox Code Playgroud)


She*_*ock 5

还有另一个原因,虽然与其他原因略有不同:我指的是一张表,结果是MyISAM引擎,而不是InnoDB.


Cfr*_*eak 5

如果您错误地引用了引用表的名称,MySQL也会抛出此错误.我把头发拉了一会儿,直到我意识到我错过了一封信foreign key (column1) references mistyped_table(column1)