字段约束
数据库的范式:
-
第一范式:原子性(这是数据库的基本要求,不满足这一点就不是关系型数据库)
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
-
第二范式:唯一性
数据表中的每条记录都必须是唯一的,为了实现区分,通常要为表加上一个列来存储唯一标识,这个唯一属性列被称为主键列。
-
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖。
依照第三范式,数据可以拆分到不同的数据表中,彼此保持关联
字段约束
Mysql中的字段约束一共有四种
唯一约束:要求字段值唯一,但是对空字段值不约束,也就是可能存在多个为空的数据。
主键约束
- 主键约束要求字段的值在全表必须唯一,且不能为空值。
- 建议逐渐一定要使用数字类型,因为数字的检索速度非常快
- 如果主键是数字类型,还可以设置自增长
AUTO_INCREMENT:表示自增长
非空约束
- 非空约束要求字段不能为NULL值
- NULL值是没有值,而不是""空字符串
NOT NULL DEFAULT FALSE
这句话是说如果没给值则给一个默认值false;
唯一约束
- 唯一约束要求如果字段值不为NULL,那么它必须全表唯一
给出一个使用示例:
CREATE TABLE t_teacher(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
tel CHAR(11) NOT NULL UNIQUE,
married BOOLEAN NOT NULL DEFAULT FALSE
);
外键约束
- 外键约束是用来保证关联数据的逻辑关系
- 外键约束是定义在子表上的
创建父表:
CREATE TABLE t_dept ( deptno INT UNSIGNED PRIMARY KEY, dname VARCHAR ( 20 ) NOT NULL UNIQUE, tel CHAR ( 4 ) UNIQUE );
创建子表,添加约束
CREATE TABLE t_emp (
empno INT UNSIGNED PRIMARY KEY,
ename VARCHAR ( 20 ) NOT NULL,
sex ENUM ( "男", "女" ) NOT NULL,
deptno INT UNSIGNED NOT NULL,
hiredate DATE NOT NULL,
FOREIGN KEY ( deptno ) REFERENCES t_dept ( deptno )
);
此时如果字表中存在使用父表字段,则附表无法直接删除这一个被使用的数据。
如图:
外键约束的闭环问题
- 如果形成外键闭环,我们就无法删除任何一张表的记录