首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时,MYSQL自动创建索引

时,MYSQL自动创建索引
EN

Stack Overflow用户
提问于 2018-04-29 13:07:58
回答 1查看 1.7K关注 0票数 0

我有以下主表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `table_1` (
  `id` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下表如下:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `table_2` (
  `id_1` BIGINT UNSIGNED NOT NULL,
  `id_2` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id_1`,`id_2`),
  FOREIGN KEY (`id_1`) REFERENCES table_1(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`id_2`) REFERENCES table_2(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

由于某些原因,在创建上面的表时,我得到了MYSQL自动创建的以下索引:

代码语言:javascript
复制
    Keyname Type    Unique  Packed  Column  Cardinality Collation Null  
      id_2  BTREE     No       No   id_2    94695       A      No   

所以MYSQL正在为第二列创建一个名为id_2 in table_2的索引。奇怪的是,它不是在两个外键上创建的,如果我只创建一个外键,MYSQL就不会创建这样的索引。

我尝试删除索引并得到以下错误:

代码语言:javascript
复制
 Cannot drop index 'id_2': needed in a foreign key constraint

那么,为什么MYSQL需要创建这样的索引,为什么要在这两个键上创建呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 13:12:39

与其他数据库不同,MySQL为外键约束创建索引。正如文档中所解释的那样

index_name表示一个外键ID。如果子表上已经有一个可以支持外键的显式定义索引,则忽略index_name值。否则,MySQL将隐式创建一个外键索引,该索引根据以下规则命名:。。

在您的示例中,其中一个外键声明由主键索引处理,因为id_1是这两个声明中的第一个键。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50086905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档