2012-10-10 58 views
4

我正在为我的大学任务创建我的第一个MySQL数据库。不幸的是,我一直试图用它们之间的外键创建实际的表。MySQL:无法创建表(errno:150)

这是错误的MySQL工作台正向工程向导为:

执行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; 
+0

Post'CREATE TABLE Spor'和'CREATE TABLE Artist'。通常,Err150意味着主表和相关表之间存在数据类型不匹配。这也是可疑的:'参考文献Spor(Verk,Verk)'也许应该是'(Plate,Verk)'? –

+0

可能会成为问题吗? – Horen

+0

第一篇文章更新了spor和艺术家查询。我已经尝试将ø更改为o,但这不是它看起来的问题。 我已经将完整的脚本上传到http://pastebin.com/ZFPiqFUs – user1736049

回答

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)如您已定义它,那么你也将遇到err150由于Spor.PlateFremført.Plate之间的类型不匹配。将Fremført.Plate更改为VARCHAR(45)

+0

我将所有数据类型都更改为VARCHAR(45),但仍然出现错误。 这是为赋值给出的关系模式:0​​http://ptpimg.me/edptp1.png 我一定误解了它。我阅读它的方式意味着verk(SPOR)是板(FREMFØRT)和verk(FREMFØRT)的关键 – user1736049

+0

@ user1736049您将'Artist.ArtistNavn'更改为'VARCHAR(45)'? –

+0

是的,模式的所有列,包括Artist.ArtistNavn。 – user1736049

0

(错误:150)的错误意味着失败FK所以创建表太....

请检查您的FK。

  • 您是否已经创建了它? (PK指向这张表的那张桌子)
  • 你的拼写正确吗?
  • 它与PK的数据类型是否相同?
相关问题