1

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

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 的标准安装。

4

2 回答 2

5

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

例如,您primary key(Typ,SerienNr)在表 flugzeug 中定义了主键,但在表 Abflug 中您尝试引用Foreign key(SerienNr) references Flugzeug(SerienNr).

您必须引用整个密钥 ( Foreign key(Typ, SerienNr) references Flugzeug(Typ,SerienNr))。

于 2011-01-09T18:59:49.523 回答
0

执行 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. 您只为主键创建了一个索引,它是Flugbez和的组合FDatum。要实现您的需要,您必须Flug.Flugbez为主键创建索引或引用Flugbez, FDatum

同样适用于Flug.FDatum,Flugzeug.SerienNr引用的Abflug.FDatum, Abflug.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);
于 2021-07-07T21:29:11.310 回答