错误 1005 (HY000):使用外键时无法创建表
我用注释标记的两个外键有什么问题?
create database db;
use db;
create table Flug(
Flugbez varchar(20),
FDatum Date,
Ziel varchar(20),
Flugzeit int,
Entfernung int,
Primary Key (Flugbez, FDatum)
);
create table Flugzeugtyp(
Typ varchar(20),
Hersteller varchar(20),
SitzAnzahl int,
Reisegeschw int,
primary key (Typ)
);
create table flugzeug(
Typ varchar(20),
SerienNr int,
AnschDatum Date,
FlugStd int,
primary key(Typ,SerienNr),
foreign key(Typ) references Flugzeugtyp(Typ)
);
create table Abflug(
Flugbez varchar(20),
FDatum Date,
Typ varchar(20),
Seriennr int,
Kaptaen varchar(20),
Primary key(Flugbez,FDatum,Typ,SerienNr),
Foreign key(Flugbez) references Flug(Flugbez),
-- Foreign key(FDatum) references Flug(FDatum),
Foreign key(Typ) references Flugzeugtyp(Typ)
-- ,Foreign key(SerienNr) references Flugzeug(SerienNr)
);
当我取消注释外键时,出现以下错误:
ERROR 1005 (HY000): Can't create table 'db.abflug' (errno: 150)
我使用 MySQL Server 5.5 的标准安装。
what is wrong with the two foreign keys which I have marked with comments?
create database db;
use db;
create table Flug(
Flugbez varchar(20),
FDatum Date,
Ziel varchar(20),
Flugzeit int,
Entfernung int,
Primary Key (Flugbez, FDatum)
);
create table Flugzeugtyp(
Typ varchar(20),
Hersteller varchar(20),
SitzAnzahl int,
Reisegeschw int,
primary key (Typ)
);
create table flugzeug(
Typ varchar(20),
SerienNr int,
AnschDatum Date,
FlugStd int,
primary key(Typ,SerienNr),
foreign key(Typ) references Flugzeugtyp(Typ)
);
create table Abflug(
Flugbez varchar(20),
FDatum Date,
Typ varchar(20),
Seriennr int,
Kaptaen varchar(20),
Primary key(Flugbez,FDatum,Typ,SerienNr),
Foreign key(Flugbez) references Flug(Flugbez),
-- Foreign key(FDatum) references Flug(FDatum),
Foreign key(Typ) references Flugzeugtyp(Typ)
-- ,Foreign key(SerienNr) references Flugzeug(SerienNr)
);
When I uncomment the foreign keys, I get the following error:
ERROR 1005 (HY000): Can't create table 'db.abflug' (errno: 150)
I use a Standard Installation of MySQL Server 5.5.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题在于您引用的主键是复合键,但您只是尝试引用外键中的其中一列(而不是第一列)。
例如,您在表flugzeug中定义主键
primary key(Typ,SerienNr)
,但在表Abflug中您尝试引用外键(SerienNr)引用Flugzeug(SerienNr)
。您必须引用整个密钥(
外键(Typ, SerienNr) 引用 Flugzeug(Typ,SerienNr)
)。The problem is that the primary keys you're referencing are compound keys, but you're only trying to reference one of the columns (not the first) in the foreign keys.
For instance, you define the primary key
primary key(Typ,SerienNr)
in table flugzeug but in table Abflug you try to referenceForeign key(SerienNr) references Flugzeug(SerienNr)
.You must reference the whole key (
Foreign key(Typ, SerienNr) references Flugzeug(Typ,SerienNr)
).执行 SQL 代码时,我得到的完整消息是:
这意味着您的列
Flug.Flugbez
未在Flug
中建立索引。您仅为主键创建了一个索引,该主键是Flugbez
和FDatum
的组合。为了实现您的需要,您必须为Flug.Flugbez
创建索引或引用主键Flugbez, FDatum
。这同样适用于通过
Abflug.FDatum
、Abflug.SerienNr
引用的Flug.FDatum
和Flugzeug.SerienNr
。要解决您的问题,您可以为您引用的每一列创建索引。您可以稍微调整一下索引创建示例:
When executing your SQL code, the full message I get is:
This means, that your column
Flug.Flugbez
is not indexed inFlug
. You only created an index for the primary key which is a combination ofFlugbez
andFDatum
. To achieve what you need, you have to create an index forFlug.Flugbez
or reference the primary keyFlugbez, FDatum
.Same applies for
Flug.FDatum
andFlugzeug.SerienNr
that are referenced withAbflug.FDatum
,Abflug.SerienNr
.To solve your issue you can create indexes for each column you are referencing. Example index creation you may adjust a little: