一、数据类型
二、八大约束
数据库的八大约束
- unsigned(符号约束): 限制列类型(数值型)的值
- not null(非空约束): 指示某列不能存储空值
- unique(唯一约束): 保证某列的每行必须有唯一的值,但可以有null
- default(缺省约束): 规定给列没有赋值时的默认值
- auto_increment(自增约束): 添加自增属性的项必须为数字,并且必须为主键,并且只有缺省的时候才会使用自增
- primary key(主键约束): not null 和 unique的结合
- foreign key(外键约束): 保证一个表中的数据匹配到另一个表中的值的参照完整性
- check(检查约束): 保证列中的值符合指定的条件.对于mysql数据库,对check字句进行分析,但是忽略check字句
unsigned
»符号约束:限制列类型(数值型)的值«
1
2
3
|
CREATE TABLE student (
id int UNSIGNED
);
|
not null
»非空约束:限制列类型的值非空,即column必须有非空值«
1
2
3
|
CREATE TABLE student (
name varchar(8) NOT NULL
);
|
unique
»唯一约束:column 的值不能重复但可以有多个null«
1
2
3
4
5
|
CREATE TABLE t4 (
id int UNIQUE,
email VARCHAR(32) UNIQUE
);
#一张表能有多个受唯一约束的column
|
default
»缺省约束:规定没有给列赋值时的默认值«
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#为math和english添加缺省约束,缺省值为60
CREATE TABLE student(
id int,
age int,
name varchar(8),
birth date,
math decimal(10, 2) DEFAULT 60,
english decimal(10, 2) DEFAULT 60
);
#插入数据,没有指定math和english时会被修改为默认值
INTO student(id, age, name) values(3, 16, "李华");
Query OK, 1 row affected (0.001 sec)
select * from student;
+------+------+--------+-------+-------+---------+
| id | age | name | birth | math | english |
+------+------+--------+-------+-------+---------+
| 3 | 16 | 李华 | NULL | 60.00 | 60.00 |
+------+------+--------+-------+-------+---------+
|
auto_increment
»自增约束:«
- 表中数据从1开始自增,每次为上一条记录的+1
- 如果删除了表中数据,序号并不会重置,而是继续从删除的位置自增
1
2
3
|
CREATE TABLE student (
id int PRIMARY KEY AUTO_INCREMENT
);
|
primary key
»主键约束:column 的值不能重复且不能为null«
-
一张表最多只能有一个受主键约束的column,但可以有多个column受复合主键约束
-
复合主键语法:primary key(column1,column2…) ,放在列类型定义的最后
-
复合主键约束的所有column的值不能同时重复和不能同时为null
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE t3-1 (
id int ,
phone int PRIMARY KEY
);
CREATE TABLE t3-2 (
id int ,
name varchar(32) ,
email varchar(32),
PRIMARY KEY(id,`name`)
);
|
foreign key
»外键约束:用于定义主表和从表之间的关系«
-
FOREIGN KEY (外键项) REFERENCES 关联表名(关联表中的对应项)
-
主从表中受外键约束的column一定同时也要受主键或唯一约束,来保证值不会重复
-
存储引擎为innodb的表才支持外键约束
-
主从表中受外键约束的column类型的数据类型要保持一致,长度可以不同
-
从表中受外键约束的column的值必须是主表中受外键约束的column的值的子集,除非为null值
-
一旦子集的值出现过了,那么主集对应的值就无法被修改和删除
当我们的表中有数据与另一个表有关联的时候,就需要用到外键约束。例如学生表(从表)中存储了班级的信息,但是在班级表(主表)中并没有这个班级存在,
就会导致数据出现冲突,所以必须将两个表关联起来
1
2
3
4
5
6
|
//主表
CREATE TABLE my_class (
#班级编号
id int PRIMARY KEY ,
name varchar(32) NOT NULL DEFAULT ''
);
|
1
2
3
4
5
6
7
8
9
10
11
|
//从表
CREATE TABLE my_stu (
#学生编号
id int PRIMARY KEY ,
#学生姓名
name varchar(32) NOT NULL DEFAULT '',
#学生所在班级的编号
class_id int ,
#指定外键关系
FOREIGN KEY (class_id) REFERENCES my_class(id)
);
|
check
»check约束:用于强制column的值必须满足指定的条件«
1
2
3
4
5
6
7
8
|
CREATE TABLE t6 (
id int PRIMARY KEY,
name varchar(32) ,
#下面指定check约束的条件:gender 只能在集合('man','woman')中2选1
gender varchar(6) CHECK (gender IN('man','woman')),
#下面指定check约束的条件:sal > 1000 AND sal < 2000
sal double CHECK ( sal > 1000 AND sal < 2000)
);
|
三、三大范式
第一范式
要求数据库表的每一列都是不可分割的原子数据项
第二范式
在第一范式的基础上,非主键数据必须完全依赖主键,不能部分依赖(针对组合主键)。目的是确保一个表只说明一个事物
第三范式
主要解决依赖关系传递带来的数据冗余问题,例如
1
2
3
4
5
|
+------+------+--------+-----------+-----------+------------+
| 学号 | 姓名 | 性别 | 班主任姓名 | 班主任性别 | 班主任年龄 |
+------+------+--------+-----------+-----------+------------+
| 3 | 16 | 李华 | 小明 | 女 | 35 |
+------+------+--------+-----------+-----------+------------+
|
上图中,班主任性别与班主任年龄直接依赖于班主任姓名,而与主键学号并没有直接的依赖关系,而是间接,存在着依赖传递的问题。
所以需要将这两项分割出去单独建表:
1
2
3
4
5
|
+------+------+--------+-----------+ +-----------+-----------+------------+
| 学号 | 姓名 | 性别 | 班主任姓名 | | 班主任姓名 | 班主任性别 | 班主任年龄 |
+------+------+--------+-----------+ +-----------+-----------+------------+
| 3 | 16 | 李华 | 小明 | | 小明 | 女 | 35 |
+------+------+--------+-----------+ +-----------+-----------+------------+
|
参考链接