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
中编制索引。您只为主键创建了一个索引,它是Flugbez
和FDatum
的组合。要实现您的需要,您必须为Flug.Flugbez
创建索引或引用主键Flugbez, FDatum
。
同样适用于Abflug.FDatum
、Abflug.SerienNr
引用的Flug.FDatum
和Flugzeug.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)
SQLSTATE [HY000]:一般错误:1005 无法创建表`Data`.`company eligibilities`(errno:150“外键约束形成错误”)
SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]
SQLSTATE [HY000]:一般错误:1005 无法创建表 `ic`.`livros`(errno: 150 "外键约束格式不正确") id`))