定义外键是否也定义了索引?我有mysql v5.1.46&我正在查看MySQL Administrator工具,它将外键显示为索引,所以我想确认一下?
答案 0 :(得分:8)
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);