MySQL: 无法创建表 (errno: 150)

标签 mysql foreign-keys mysql-workbench

我正在为我大学的一项作业开发我的第一个 MySQL 数据库。不幸的是,我在尝试创建它们之间带有外键的实际表时被困了一段时间。

这是 MySQL Workbench 正向工程向导给出的错误:

在服务器中执行SQL脚本

ERROR: Error 1005: Can't create table 'test.fremført' (errno: 150)    

CREATE  TABLE IF NOT EXISTS `Fremført` (    
  `Plate` VARCHAR(20) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  `Artist` VARCHAR(45) NOT NULL ,
  `Dato` DATE NULL ,
  PRIMARY KEY (`Plate`, `Verk`, `Artist`) ,
  INDEX `Fremført->Artist_idx` (`Artist` ASC) ,
  INDEX `Fremført->Spor_idx` (`Plate` ASC, `Verk` ASC) ,
  CONSTRAINT `Fremført->Artist`
    FOREIGN KEY (`Artist` )
    REFERENCES `Artist` (`ArtistNavn` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Fremført->Spor`
    FOREIGN KEY (`Plate` , `Verk` )
    REFERENCES `Spor` (`Verk` , `Verk` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

有谁知道上面的脚本有什么问题,如果知道有解决方案吗?

谢谢!

编辑: 这是请求的 spor 查询

DROP TABLE IF EXISTS `Spor` ;
CREATE  TABLE IF NOT EXISTS `Spor` (
  `Plate` VARCHAR(45) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  `Spilletid` DECIMAL(3,2) NULL ,
  PRIMARY KEY (`Plate`, `Verk`) ,
  INDEX `Plate_idx` (`Plate` ASC) ,
  CONSTRAINT `Plate`
    FOREIGN KEY (`Plate` )
    REFERENCES `Plate` (`KatalogNr` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



DROP TABLE IF EXISTS `Artist` ;
CREATE  TABLE IF NOT EXISTS `Artist` (
  `ArtistNavn` VARCHAR(30) NOT NULL ,
  `Artistcol` VARCHAR(45) NULL ,
  PRIMARY KEY (`ArtistNavn`) )
ENGINE = InnoDB;

最佳答案

errno150 通常与主列和相关列的数据类型不匹配有关。它们必须完全匹配,包括字符长度。

我看到 Fremført.artist (VARCHAR(45)) 和 Artist.ArtistNavn (VARCHAR( 30))。这些必须相同才能使 FOREIGN KEY 约束成功。

CREATE  TABLE IF NOT EXISTS `Fremført` (    
  `Plate` VARCHAR(20) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  /* Must match the primary table VARCHAR(30) */
  `Artist` VARCHAR(30) NOT NULL ,
  `Dato` DATE NULL ,
  PRIMARY KEY (`Plate`, `Verk`, `Artist`) ,
  INDEX `Fremført->Artist_idx` (`Artist` ASC) ,
  INDEX `Fremført->Spor_idx` (`Plate` ASC, `Verk` ASC) ,
  CONSTRAINT `Fremført->Artist`
    FOREIGN KEY (`Artist` )
    REFERENCES `Artist` (`ArtistNavn` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Fremført->Spor`
    FOREIGN KEY (`Plate` , `Verk` )
    /* Was this intentional, rather than (`Plate`, `Verk`)? */
    /* If not, you must also match the data type of `Plate` VARCHAR(20) to that of Spor.Plate VARCHAR(45) */
    REFERENCES `Spor` (`Verk` , `Verk` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

如上所述,如果约束 Fremført->Spor 旨在引用 Spor (Plate , Verk ) 而不是 Spor (Verk , Verk ) 因为你已经定义了它,那么由于 Spor.PlateFremført.Plate 之间的类型不匹配,你也会遇到 err150。将 Fremført.Plate 更改为 VARCHAR(45)

关于MySQL: 无法创建表 (errno: 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827426/

相关文章:

jquery - 如何将数组分成 block 并将它们发布到mysql?

php - 如何在 Laravel 中制作简单的动态下拉列表?

mysql - 如何在 MySQL 中导入使用 `NULL` 关键字编码的日期时间字段?

MySQL:如何允许远程连接到 mysql

php - 无法从android应用程序将数据插入mysql

asp.net - 我想将 "An error occurred object reference not set to an instance of an object while insert and update new record"插入数据库

php - 如何在 codeigniter 中存储和检索数据库中的图像?

java - 使用 JDBC 获取所有外键

mysql - Cakephp hasMany 有多个不是主键的外键

mysql - 插入到 phpmyadmin 上的触发器