Mysql InnoDB:创建具有显式索引名的外键

Mysql InnoDB:创建具有显式索引名的外键,mysql,innodb,Mysql,Innodb,我试图同时创建一个带索引的外键,并显式指定它们的名称 说: index_name表示外键ID。如果给定,则在 外键的索引是明确定义的。否则,如果 InnoDB为外键创建一个索引,它使用索引名称 索引名。 因此,我尝试了以下方法: altertablemytable 添加约束FK_MyTable_区域外键 IDX_MyTable_分区(分区ID) 参考区(id); 但是SHOW CREATE TABLE显示索引名IDX_MyTable_Zone未被考虑,并且外键名也已用于索引名: CREATE

我试图同时创建一个带索引的外键,并显式指定它们的名称

说:

index_name表示外键ID。如果给定,则在 外键的索引是明确定义的。否则,如果 InnoDB为外键创建一个索引,它使用索引名称 索引名。

因此,我尝试了以下方法:

altertablemytable
添加约束FK_MyTable_区域外键
IDX_MyTable_分区(分区ID)
参考区(id);
但是
SHOW CREATE TABLE
显示索引名
IDX_MyTable_Zone
未被考虑,并且外键名也已用于索引名:

CREATE TABLE`MyTable`(
`zoneId`int(10)无符号非空,
键'FK_MyTable_Zone'('zoneId'),
约束'FK_MyTable_Zone'外键('zoneId`)引用'Zone`('id`)
)ENGINE=InnoDB默认字符集=1;

我遗漏了什么吗?

我从未使用过这种语法。为了控制名称,我总是将索引与外键分开创建

这应该适合您:

ALTER TABLE MyTable
ADD KEY IDX_MyTable_Zone (zoneId),
ADD CONSTRAINT FK_MyTable_Zone FOREIGN KEY (zoneId) REFERENCES Zone (id);

是的,我遇到过这种语法,但我总是担心它可能会创建两次索引(现在或将来的MySQL版本),因为这是一个中的两个不同语句,因为如果不指定索引,它无论如何都会创建一个。这里没有风险?只要在添加索引时显式地命名它,就安全了。即使在一个
ALTER TABLE
语句中添加索引,然后在另一个语句中添加FK,FK也不会创建单独的索引。有趣的是,如果我只指定
IDX\u MyTable\u Zone
而不指定
FK\u MyTable\u Zone
,则索引名已满足要求,外键名将自动生成。
ALTER TABLE MyTable
ADD KEY IDX_MyTable_Zone (zoneId),
ADD CONSTRAINT FK_MyTable_Zone FOREIGN KEY (zoneId) REFERENCES Zone (id);