我知道如何使用索引如下代码。我知道如何使用外键和主键。
CREATE TABLE tasks (
task_id int unsigned NOT NULL AUTO_INCREMENT,
parent_id int unsigned NOT NULL DEFAULT 0,
task varchar(100) NOT NULL,
date_added timestamp NOT NULL,
date_completed timestamp NULL,
PRIMARY KEY ( task_id ),
INDEX parent ( parent_id )
)
然而,我发现一个代码使用KEY而不是索引如下。
CREATE TABLE orders (
order_id int unsigned NOT NULL AUTO_INCREMENT,
-- etc
KEY order_date ( order_date )
)
我在MySQL的官方页面上找不到任何解释。有人能告诉我KEY和INDEX有什么区别吗?
我看到的唯一区别是,当我使用键…,我需要重复单词,例如KEY order_date (order_date)。
没有区别。它们是同义词,尽管INDEX应该是首选的(因为INDEX是ISO SQL兼容的,而KEY是特定于mysql的、不可移植的扩展)。
从CREATE TABLE手动条目:
KEY通常是INDEX的同义词。在列定义中,键属性PRIMARY key也可以指定为key。这是为了与其他数据库系统兼容而实现的。
通过“键属性PRIMARY key也可以在列定义中指定为key”,这意味着下面的三个CREATE TABLE语句是等效的,并在数据库中生成相同的TABLE对象:
CREATE TABLE orders1 (
order_id int PRIMARY KEY
);
CREATE TABLE orders2 (
order_id int KEY
);
CREATE TABLE orders3 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
);
...而下面这两个语句(对于orders4, orders5)是彼此等效的,但与上面的3个语句不同,因为这里的KEY和INDEX是INDEX的同义词,而不是PRIMARY KEY:
CREATE TABLE orders4 (
order_id int NOT NULL,
KEY ( order_id )
);
CREATE TABLE orders5 (
order_id int NOT NULL,
INDEX ( order_id )
);
...由于KEY (order_id)和INDEX (order_id)成员没有定义PRIMARY KEY,它们只定义了一个通用的INDEX对象,这一点也不像KEY(因为它不能唯一标识一行)。
运行SHOW CREATE TABLE orders1…5可以看到:
Table |
SHOW CREATE TABLE... |
orders1 |
CREATE TABLE orders1 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
) |
orders2 |
CREATE TABLE orders2 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
) |
orders3 |
CREATE TABLE orders3 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
) |
orders4 |
CREATE TABLE orders4 (
order_id int NOT NULL,
KEY ( order_id )
) |
orders5 |
CREATE TABLE orders5 (
order_id int NOT NULL,
KEY ( order_id )
) |