MySQL:无法创建表(错误号:150)

时间:2012-10-10 20:02:48

标签: 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;

3 个答案:

答案 0 :(得分:3)

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

我发现Fremført.artistVARCHAR(45))和Artist.ArtistNavnVARCHAR(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 ),因为您已定义它,那么由于类型不匹配,您还会遇到错误150 Spor.PlateFremført.Plate。将Fremført.Plate更改为VARCHAR(45)

答案 1 :(得分:0)

错误150是外键约束问题。我怀疑你有两个FK中的一个有问题。

请参阅:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

答案 2 :(得分:0)

(错误:150)该错误意味着FK失败,因此创建表也是....

请查看您的FK。

  • 你已经创建了吗? (表中PK指向此表)
  • 你的拼写是否合适?
  • 它与PK的数据类型相同吗?
相关问题