Gra*_*erg 209

是的,但仅限于.Innodb是目前唯一实现外键的表格格式.


小智 121

显然,罗伯特发布的链接中指定的索引是自动创建的.

InnoDB需要外键和引用键的索引,以便外键检查可以快速,不需要表扫描.在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列.如果引用表不存在,则会自动在引用表上创建此索引.(这与一些旧版本形成对比,在旧版本中必须显式创建索引或者外键约束的创建将失败.)如果给定,则使用index_name,如前所述.

InnoDB和FOREIGN KEY约束

  • +1比选择的答案要好得多,从文档中提供证据 (7认同)
  • @ user2045006你也可以参考[doc 5.0](http://dev.mysql.com/doc/refman/5.0/en/create-table-foreign-keys.html)[doc 5.6](http:// dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html)获取确切的引用文字 (7认同)
  • 引用的文本似乎不再包含在MySQL文档中,因此不清楚这是否仍然存在. (6认同)
  • 在当前的文档中,文本中只有一个细微的变化(我认为含义是相似的):`InnoDB 允许外键引用任何索引列或列组。但是,在引用的表中,必须存在一个索引,其中引用的列是相同顺序的第一列。` (2认同)

Rob*_*ble 21

是的,请参阅InnoDB和FOREIGN KEY约束.

  • 这个答案是一个很好的例子,说明了为什么答案永远不应该只包含指向可能答案的链接。目前,链接的页面根本没有回答这个问题。 (11认同)
  • 请将所有信息添加到答案本身,而不是仅发布链接 (2认同)

Tho*_*röm 11

如果执行ALTER TABLE(而不是CREATE TABLE),则不会自动获取索引,至少根据文档(链接是针对5.1但是5.5的相同):

[...]使用ALTER TABLE向表中添加外键约束时,请记住首先创建所需的索引.

  • 我尝试了_5.5.31_并且`ALTER TABLE`创建了一个索引. (11认同)
  • 我还尝试了MySQL 5.6和MariaDB 10以及ALTER TABLE创建的索引.有趣的是,mysqlindexcheck报告索引是一个"冗余索引".我试图删除它,但我得到以下错误:"错误1553(HY000):无法删除索引'index_name':在外键约束中需要".因此,不可能删除该索引并保留外键. (2认同)
  • 您可能想修改您的答案。MySQL *总是*创建一个索引来加速外键检查*如果索引尚不存在*。这些文档试图告诉您,在外键约束之前创建索引可能会加快速度。例如,InnoDB 可以使用可以用作外键检查索引的复合键索引,而不是自动生成冗余索引。 (2认同)

Fah*_*hmi 6

对于那些正在寻找5.7 docs报价的人:

MySQL需要在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。如果这样的索引不存在,则会在引用表上自动创建。如果您创建另一个可用于强制外键约束的索引,则以后可能会静默删除该索引。如果给定,则使用index_name(如前所述)。


Wol*_*370 5

如前所述,它适用于 InnoDB。起初我觉得很奇怪许多其他(特别是 MS SQL 和 DB2)没有。只有在表行很少时,表空间扫描才比索引扫描更好 - 因此对于绝大多数情况,外键希望被索引。然后它有点打击我 - 这并不一定意味着它必须是一个独立的(一列)索引 - 它在 MySQL 的自动 FK 索引中。所以,这可能是 MS SQL、DB2(我不确定是否使用 Oracle)等将它留给 DBA 的原因;毕竟大表上的多个索引会导致性能和空间问题。

  • 你提出了一个关于复合键索引的好观点;但是,如果新创建的组合键索引履行了快速检查外键的义务,MySQL 将自动/静默删除自动生成的单键索引。老实说,我不知道为什么 MS SQL、DB2 和其他人不这样做。他们没有什么借口。我想不出在外键上自动生成索引会有害的用例。 (2认同)