MySQL外键问题

时间:2010-07-18 19:02:58

标签: sql mysql foreign-keys

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

2 个答案:

答案 0 :(得分:8)

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

documentation

中介绍了这一点
  

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

答案 1 :(得分: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'

这种情况并不常见,因为您经常创建引用引用表的主键的外键约束,并且主键会自动编入索引。但是可能值得记住。

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

CREATE INDEX ix_orders_code ON orders(code);