MySQL:字段约束与索引
字段约束
MySQL的字段约束共四种:
约束名 | 关键字 | 描述 |
---|---|---|
主键约束 | PRIMARY KEY | 字段值唯一,且不能为NULL |
非空约束 | NOT NULL | 字段值不能为NULL |
唯一约束 | UNIQUE | 字段值唯一,但可以为NULL |
外键约束 | FOREIGN KEY | 保持关联数据的逻辑性 |
关于主键约束
- 主键约束字段要求字段值的唯一性,且不能为NULL
- 建议使用数字类型的主键,提高检索速度,一般设置自增主键或GUID
CREATE TABLE t_emp(
id INT PRIMARY KEY AUTO_INCREMENT,
...
);
关于非空约束
- 插入数据时,该字段值不能为NULL
- NULL不是空字符串
- 可以使用NOT NULL,但设置默认值
CREATE TABLE t_emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
married BOOLEAN NOT NULL DEFAULT FALSE
);
关于外键约束
外键约束主要用于保证数据的逻辑关系
t_dept:
dep_id | dep_name | tel |
---|---|---|
11 | 研发部 | 111 |
12 | 测试部 | 112 |
13 | 销售部 | 113 |
t_emp:
emp_num | name | sex | dep_id |
---|---|---|---|
1 | 张三 | 男 | 11 |
2 | 李四 | 男 | 12 |
外键约束写在子表中:
-- 父表:
CREATE TABLE t_dept(
dep_id INT USIGNED PRIMARY KEY,
dep_name VARCHAR(20) NOT NULL UNIQUE,
tel CHAR(3) UNIQUE
);
-- 子表:
CREATE TABLE t_emp(
emp_num INT USIGNED PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex CHAR(3) ENUM('男','女') NOT NULL,
dep_id INT USIGNED,
FOREIGN KEY (dep_id) REFERENCES t_dept(dep_id)
);
设置外键约束后,若要删除父表内容,必须先删除子表相关的内容,这种约束能保证逻辑关系。
但另一方面,多表的相互外键关联,可能形成外键闭环,导致无法删除任何一张表的记录。故可以不设置外键约束,仅依靠应用程序的逻辑来保证。
索引机制
什么是数据库索引?
简单来说,索引是关系数据库中对某一列或多个列的值进行预排序的数据结构,一般数据库需要维护索引对应的二叉树。
为什么需要索引?
数据库如果有上万甚至上亿条记录,想要提高查询速度,就需要使用索引。
如何创建索引?
①、创建表的时候添加索引
CREATE TABLE table_name(
...,
INDEX [索引名] (字段名),
...
);
索引名是可选项,如果不定义索引名,则使用字段名作为索引名。
②、在已创建的表中添加索引
# 语法一:
CREATE INDEX 索引名 ON 表名(字段);
# 语法二:
ALTER TABLE 表名 ADD INDEX [索引名](字段名)
# 查询索引
SHOW INDEX FROM 表名;
# 删除索引
DROP INDEX 索引名 ON 表名;
创建索引要遵循什么原则?
-
哪些表需要加索引?:数据量大,且经常被查询的数据表
-
哪些字段要加索引?:经常作为检索条件的字段
-
哪些字段不要加索引?:大字段类型(如长度超过50的字符串)