2017-04-14 95 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,我已经更新了答案。 –

相关问题