MYSQL在自动创建索引时

时间:2018-04-29 13:07:58

标签: mysql sql database database-design relational-database

我有以下主表:

CREATE TABLE IF NOT EXISTS `table_1` (
  `id` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以下表格:

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自动创建的以下索引:

    Keyname Type    Unique  Packed  Column  Cardinality Collation Null  
      id_2  BTREE     No       No   id_2    94695       A      No   

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

我试图删除索引并收到以下错误:

 Cannot drop index 'id_2': needed in a foreign key constraint

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

1 个答案:

答案 0 :(得分:3)

与其他数据库不同,MySQL为外键约束创建索引。正如documentation

中所述
  

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

在您的情况下,其中一个外键声明由主键索引处理,因为id_1是它们中的第一个键。