字段约束
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)
);
设置外键约束后,若要删除父表内容,必须先删除子表相关的内容,这种约束能保证逻辑关系。
但另一方面,多表的相互外键关联,可能形成外键闭环,导致无法删除任何一张表的记录。故可以不设置外键约束,仅依靠应用程序的逻辑来保证。
关于数据库范式
构造数据库需要遵循一定的规则,这种规则就是范式。目前关系型数据库有6种范式,一般只需满足第三范式即可。
第一范式:原子性
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复属性。
第一范式是数据库的基本要求,不满足第一范式就不是关系型数据库。
如下数据表不符合第一范式:
student_id
name
class
1001
张三
一年级三班
修改后:
student_id
name
grade
class
1001
张三
一年级
三班
第二范式:唯一性
数据表中的每一条记录必须是唯一的的,通常使用添加主键作为唯一标识。
第二范式的提出是为了避免保存重复数据,浪费空间。
如下数据不符合第二范式:张三同一天考了两次试,无法区分两次记录
student_id
name
exam_time
1001
张三
2021-02-15
1001
张三
2021-02-15
修改后:
id
student_id
name
exam_time
1
1001
张三
2021-02-15
2
1001
张三
2021-02-15
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖。
当满足了第三范式之后,就同时满足了第一和第二范式
按照第三范式创建数据表,将来检索和提取数据时会很方便。按照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联。
如下数据不符合第三范式:
class
name
english_score
math_score
三班
张三
90
100
修改后:
class
name
student_id
三班
张三
1001
student_id
english_score
math_score
1001
90
100