错误1005(HY000):无法创建表db.Wine(错误:150)
问题描述:
我有这样的代码来创建一些表:错误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)
有谁知道如何解决这一问题?谢谢。
答
您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)
);
答
这是因为在表中FOREIGH KEY
列引用既不是主键也不是有索引(父表)的列。您可以更改类型分别使它们指向的Grapes
ID
和No
列和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。
在列名称上使用反向标签。不确定,但我认为NO对SQL有特殊意义。尝试将_No int_更改为_ \'No \'int_也在主键子句中。 –
通常,外键应引用另一个表中的主键。 – Barmar