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

Posted

技术标签:

【中文标题】ERROR 1005 (HY000): 使用外键时无法创建表【英文标题】:ERROR 1005 (HY000): Can't create table when using foreign keys 【发布时间】: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 的标准安装。

【问题讨论】:

【参考方案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))。

【讨论】:

以上是关于ERROR 1005 (HY000): 使用外键时无法创建表的主要内容,如果未能解决你的问题,请参考以下文章

Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)

外键创建错误

添加外键时Laravel迁移错误

SQLSTATE [HY000]:一般错误:1005 无法创建表`Data`.`company eligibilities`(errno:150“外键约束形成错误”)

SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]

SQLSTATE [HY000]:一般错误:1005 无法创建表 `ic`.`livros`(errno: 150 "外键约束格式不正确") id`))