2012-10-10 59 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的數據類型是否相同?
相關問題