【问题标题】:ERROR 1005 (HY000): Can't create table when using foreign keysERROR 1005 (HY000): 使用外键时无法创建表
【发布时间】:2011-06-06 04:16:13
【问题描述】:

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

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

【问题讨论】:

    标签: sql mysql foreign-keys create-table


    【解决方案1】:

    执行您的 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);
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-16
        • 2014-10-20
        • 2020-08-07
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 2017-04-09
        • 2016-10-12
        相关资源
        最近更新 更多