MySQL外键问题

kap*_*pso 6 mysql sql foreign-keys

定义外键是否也定义了索引?我有mysql v5.1.46&我正在查看MySQL Administrator工具,它显示外键作为索引,所以我想确认一下?

Mar*_*ers 8

  • 如果已存在可用索引(将外键列列为同一顺序中的第一列的索引),则不会创建新索引.
  • 如果没有可用的索引,则创建外键也会创建索引.

这在文档中有所涉及.

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


Dan*_*llo 3

是的,当您定义外键约束时,MySQL 5.1 会自动在引用表上创建索引。MySQL 需要在引用表和外键引用表上都有索引。

但请注意,索引在引用表上自动创建,而不是在被引用表上创建。MySQL 不允许您创建引用被引用表中不能使用索引的字段的外键:

CREATE TABLE orders (
  id int PRIMARY KEY,
  code int,
  name varchar(10)
) ENGINE=INNODB;

CREATE TABLE order_details (
  detail_id int PRIMARY KEY,
  order_code int,
  value int,
  FOREIGN KEY (order_code) REFERENCES orders(code)
) ENGINE=INNODB;

ERROR 1005 (HY000): Can't create table 'test.order_details'
Run Code Online (Sandbox Code Playgroud)

这并不常见,因为您经常创建引用被引用表的主键的外键约束,并且主键会自动索引。然而,这可能值得记住。

code在表的字段上创建索引orders可以解决问题:

CREATE INDEX ix_orders_code ON orders(code);
Run Code Online (Sandbox Code Playgroud)