目录

mysql数据库 | 数据类型 八大约束 三大范式

一、数据类型

二、八大约束

数据库的八大约束
  • 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的值必须满足指定的条件«

  • mysql5.7 目前还不支持check ,只做语法校验,但不会生效

  • 在mysql中实现check的功能,一般是在程序中控制,或者通过触发器完成

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     |
+------+------+--------+-----------+        +-----------+-----------+------------+

参考链接