MySQL 错误 1822:添加外键约束失败;缺少约束索引但索引存在

Posted

技术标签:

【中文标题】MySQL 错误 1822:添加外键约束失败;缺少约束索引但索引存在【英文标题】:MySQL Error 1822: Failed to add foreign key constraint; missing index for contraint BUT index exists 【发布时间】:2017-09-16 14:17:21 【问题描述】:

我正在尝试向我的航班计划表中添加一个外键,但它失败了,但我真的不知道为什么。外键应该引用 tblAircraft 表中的 txtAC_tag 属性,它是主键的一部分! 所以 tblAircraft 被索引(主键是由 idAC 和 txtAC_tag 组成的组合键 -> 组合主键可能是问题吗?)并且属性的数据类型确实匹配。

这是我的表声明和外键声明:

create table if not exists tblAircrafts(
idAC       int not null auto_increment,
txtAC_tag  varchar(255) not null,
txtAC_type varchar(255) not null,
primary key(idAC, txtAC_tag));

create table if not exists tblFlightSchedule(
ID int not null auto_increment,
datDate date,
txtFrom varchar(255),
txtTo   varchar(255),
txtFlight varchar(255),
numFlight_time_decimal decimal(4,2),
txtAC_tag varchar(255) not null,
txtAC_type varchar(255) not null,
numSeatCapacity int unsigned,
numLoad int unsigned, -- auslastung 
numDirt decimal(20,19),
numTotalFlightTime decimal(50,5),
numCumDirt decimal(20,15),
primary key(ID));

alter table tblflightschedule
add foreign key(txtAC_tag) references tblaircrafts(txtAC_tag);

这是错误消息:

Error Code: 1822. Failed to add the foreign key constaint. Missing index for constraint '' in the referenced table 'tblaircrafts'

有什么建议吗?感谢您给我的任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

问题就在这里:

add foreign key(txtAC_tag) references tblaircrafts(txtAC_tag);

在这里,您在外键关系中将txtAC_tag 绑定到tblaircrafts 表的txtAC_tag,但在tblaircrafts 中,txtAC_tag 列既不是unique 也不是primary,这就是它显示错误的原因。

对于外键关系,要创建关系的父表列必须是uniqueprimary,并且它们还必须具有相同的datatypesize

要解决此问题,请将 txtAC_tag 列设为唯一。

【讨论】:

...因此他可能应该使用约束 +1 使 txtAC_tag 唯一。 @TimBiegeleisen:是的,你说的正是。 mysql 8 中,组合键列的指定和引用顺序必须相同。 谢谢。解释清楚。【参考方案2】:

您似乎为 tblAircrafts 表创建了复合主键

如果您想将复合键引用添加到表 tblflightschedule,您需要使用以下语法:

alter table tblflightschedule
add foreign key ('int Column', txtAC_tag) references tblaircrafts **(idAC, txtAC_tag);**

而且你必须引用两列来添加外键('int Column',txtAC_tag)。

因此,您可以在 tblflightschedule 表中再添加一列,也可以从 tblaircrafts 表中删除一列。

【讨论】:

以上是关于MySQL 错误 1822:添加外键约束失败;缺少约束索引但索引存在的主要内容,如果未能解决你的问题,请参考以下文章

1822 (HY000): 添加外键约束失败

MySql - 无法添加或更新子外键约束失败[重复]

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

MySQL - 无法添加或更新子行:外键约束失败

Magento DB错误:完整性约束违规:1452无法添加或更新子行:外键约束失败

在 My SQL 中不断收到外键约束失败消息