错误 1005 (HY000):使用外键时无法创建表

发布于 2024-10-11 17:53:19 字数 1084 浏览 10 评论 0原文

我用注释标记的两个外键有什么问题?

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷夜 2024-10-18 17:53:19

问题在于您引用的主键是复合键,但您只是尝试引用外键中的其中一列(而不是第一列)。

例如,您在表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 reference Foreign key(SerienNr) references Flugzeug(SerienNr).

You must reference the whole key (Foreign key(Typ, SerienNr) references Flugzeug(Typ,SerienNr)).

白鸥掠海 2024-10-18 17:53:19

执行 SQL 代码时,我得到的完整消息是:

[HY000][1822] Failed to add the foreign key constraint. Missing index for constraint 'abflug_ibfk_2' in the referenced table 'flug'

这意味着您的列 Flug.Flugbez 未在 Flug 中建立索引。您仅为主键创建了一个索引,该主键是 FlugbezFDatum 的组合。为了实现您的需要,您必须为 Flug.Flugbez 创建索引或引用主键 Flugbez, FDatum

这同样适用于通过 Abflug.FDatumAbflug.SerienNr 引用的 Flug.FDatumFlugzeug.SerienNr

要解决您的问题,您可以为您引用的每一列创建索引。您可以稍微调整一下索引创建示例:

CREATE UNIQUE INDEX index_flugbez ON Flug (Flugbez);
CREATE UNIQUE INDEX index_flugdatum ON Flug (FDatum);
CREATE UNIQUE INDEX index_seriennr ON flugzeug (SerienNr);

When executing your SQL code, the full message I get is:

[HY000][1822] Failed to add the foreign key constraint. Missing index for constraint 'abflug_ibfk_2' in the referenced table 'flug'

This means, that your column Flug.Flugbez is not indexed in Flug. You only created an index for the primary key which is a combination of Flugbez and FDatum. To achieve what you need, you have to create an index for Flug.Flugbez or reference the primary key Flugbez, FDatum.

Same applies for Flug.FDatum and Flugzeug.SerienNr that are referenced with Abflug.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:

CREATE UNIQUE INDEX index_flugbez ON Flug (Flugbez);
CREATE UNIQUE INDEX index_flugdatum ON Flug (FDatum);
CREATE UNIQUE INDEX index_seriennr ON flugzeug (SerienNr);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文