4

我正在为我的大学作业开发我的第一个 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

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

谢谢!

编辑:这是请求的体育查询

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;
4

3 回答 3

3

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 )您定义的那样,那么您还将遇到 err150 由于 和 之间的类型不Spor.Plate匹配Fremført.Plate。更改Fremført.PlateVARCHAR(45)

于 2012-10-10T20:14:18.957 回答
0

错误 150 是外键约束问题。我怀疑您遇到的两个 FK 之一有问题。

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

于 2012-10-10T20:10:11.503 回答
0

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

请检查您的 FK。

  • 你已经创建了吗?(PK指向这个的表)
  • 你的拼写对了吗?
  • 和PK的数据类型一样吗?
于 2012-10-10T20:10:20.660 回答