2017-04-14 94 views
0

我有這樣的代碼來創建一些表:錯誤1005(HY000):無法創建表db.Wine(錯誤:150)

CREATE TABLE Appelations (
    No int AUTO_INCREMENT, 
    Appelation varchar(35), 
    County varchar(20), 
    State varchar(15), 
    Area varchar(25), 
    IsAVA varchar(3), 
    PRIMARY KEY (No) 
); 

CREATE TABLE Grapes (
    ID int AUTO_INCREMENT, 
    Grape varchar(25), 
    Color varchar(10), 
    PRIMARY KEY (ID) 
); 

CREATE TABLE Wine (
    No int AUTO_INCREMENT, 
    Grape varchar(25), 
    Winery varchar(40), 
    Appelation varchar(35), 
    Name varchar(40), 
    Year year, 
    Price int, 
    Score int, 
    Cases int, 
    PRIMARY KEY (No), 
    FOREIGN KEY (Grape) REFERENCES Grapes(Grape), 
    FOREIGN KEY (Appelation) REFERENCES Appelations(Appelation) 
); 

但是當我運行它,我得到這個錯誤:

ERROR 1005(HY000):無法創建表 'db.Wine'(錯誤:150)

有誰知道如何解決這一問題?謝謝。

+0

在列名稱上使用反向標籤。不確定,但我認爲NO對SQL有特殊意義。嘗試將_No int_更改爲_ \'No \'int_也在主鍵子句中。 –

+0

通常,外鍵應引用另一個表中的主鍵。 – Barmar

回答

1

need indexes on your foreign keys:「MySQL需要對外鍵和引用鍵進行索引,以便外鍵檢查可以很快並且不需要表掃描。」
例這裏:http://sqlfiddle.com/#!9/d228b8

CREATE TABLE Appelations (
    No int AUTO_INCREMENT, 
    Appelation varchar(35), 
    County varchar(20), 
    State varchar(15), 
    Area varchar(25), 
    IsAVA varchar(3), 
    INDEX appelation_ind (Appelation), /*<---*/ 
    PRIMARY KEY (No) 
); 

CREATE TABLE Grapes (
    ID int AUTO_INCREMENT, 
    Grape varchar(25), 
    Color varchar(10), 
    INDEX grape_ind (Grape), /*<---*/ 
    PRIMARY KEY (ID) 
); 

CREATE TABLE Wine (
    No int AUTO_INCREMENT, 
    Grape varchar(25), 
    Winery varchar(40), 
    Appelation varchar(35), 
    Name varchar(40), 
    Year year, 
    Price int, 
    Score int, 
    Cases int, 
    PRIMARY KEY (No), 
    FOREIGN KEY (Grape) REFERENCES Grapes(Grape), 
    FOREIGN KEY (Appelation) REFERENCES Appelations(Appelation) 
); 
0

這是因爲在表中FOREIGH KEY列引用既不是主鍵也不是有索引(父表)的列。您可以更改類型分別使它們指向的GrapesIDNo列和Appelations表,例如:

CREATE TABLE Wine (
    No int AUTO_INCREMENT, 
    Grape_id int, 
    Winery varchar(40), 
    Appelation_no int, 
    Name varchar(40), 
    Year year, 
    Price int, 
    Score int, 
    Cases int, 
    PRIMARY KEY (No), 
    FOREIGN KEY (Grape_id) REFERENCES Grapes(id), 
    FOREIGN KEY (Appelation_no) REFERENCES Appelations(No) 
); 

這裏的SQL Fiddle

+0

MySQL不需要外鍵來引用主鍵。它只是要求該列有一個索引。 – Barmar

+0

但這通常是正確的做法。 – Barmar

+0

謝謝@Barmar,我已經更新了答案。 –

相關問題