mysql在

yiytaume  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(275)

我有以下主表:

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_2table_2 . 奇怪的是,它不是在两个外键上都创建的,如果我只创建一个外键,mysql就不会创建这样的索引。
我试图删除索引,但出现以下错误:

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

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

50few1ms

50few1ms1#

与其他数据库不同,mysql为外键约束创建索引。如文件所述:
索引\u name表示外键id。如果子表上已显式定义了可支持外键的索引,则忽略索引\u name值。否则,mysql将隐式创建一个外键索引,该索引根据以下规则命名:。
在您的例子中,其中一个外键声明由主键索引处理,因为 id_1 都是第一把钥匙。

相关问题