MySQL基本概念 -- 主键/外键/索引

主键(PRIMARY KEY)

主键能够唯一标识表中某一行的属性或属性组。

主键是索引的一种,并且是唯一性索引的一种。

主键约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含NULL值。

主键常常与外键构成参照完整性约束,防止出现数据不一致。

每个表应当有一个主键,但每个表只能有一个主键。

1
2
3
4
5
6
7
-- 每一笔订单对应一个唯一的订单编号
-- 若字段使用AUTO_INCREMENT, 其字段类型必须是TINYINT/SMALLINT/INT/BIGINT其中一种
CREATE TABLE order (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(40) NOT NULL,
PRIMARY KEY(id)
);

外键(FOREIGN KEY)

如果一个实体的某个字段指向另一个实体的主键,就称为外键。 其中,被指向的实体,称之为主实体(主表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)。

主要作用维护两个表之间的数据一致性,加强两个表数据之间的链接的一列或多列。 每当子表中的字段需要添加记录时,必须查询父表中是否存在该字段记录。需要删除父表中的主键时,则必须查询是否有其他表的外键与其绑定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 每样商品都有特定的商品种类(电脑对应电子产品, 口红对应化妆品)
CREATE TABLE mb_item_type (
id INT NOT NULL AUTO_INCREMENT,
type VARCHAR(200) NOT NULL,
PRIMARY KEY(id)
);

INSERT INTO mb_item_type (type) VALUES ('电子产品'), ('化妆品');

CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
type_id INT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(type_id) REFERENCES mb_item_type(id)
);

-- 对应相应的商品序号
INSERT INTO item (name, type_id) VALUES ('thinkpad', 1);
INSERT INTO item (name, type_id) VALUES ('口红', 2);

-- 错误输入, 因为在mb_item_type中不存在序号为3的记录
INSERT INTO item (name, type_id) VALUES ('相机', 3);

是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。


唯一性索引(UNIQUE)

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束

1
2
3
4
5
6
7
8
-- 一名学生对应一个唯一学号
CREATE TABLE student (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(40) NOT NULL,
student_id INT NOT NULL,
PRIMARY KEY(id),
UNIQUE KEY student_unique_id (student_id) USING BTREE
);

索引(KEY)

根据特定的算法,来快速地查找到具有特定值(按一定的规则创建)的记录。

主要作用是为了检索的方便,是为了加快访问速度。

详细参见http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html


参考文章:

[1] http://blog.csdn.net/duck_arrow/article/details/8264686

[2] http://www.cnblogs.com/zunpeng/p/3878459.html

[3] http://www.w3school.com.cn/sql/