思维导图

学习目标
这篇博客主要学习一下表的约束,将表的约束的语句进行熟练掌握!!!!
真正约束字段的是数据类型,但是约束条件太单一了,表中一定要有各种约束,通过约束,让我们未来插入数据库表的数据是符合预期的,约束本质是通过技术手段倒逼程序员插入正确的数据。反过来,站在MySQL的视角,凡是插入进来的数据都是符合数据约束条件的!
约束的最终目标是:保证数据的完整性和可预期性!!!
一、空属性(null和not null约束)
空属性中有两个值:null(默认的)和 not null(不为空)。数据路默认字段基本都是字段为空,但是实际开发的过程中,尽可能保证数据不为空,因为数据为空无法进行过运算。如下图所示:

举个例子:创建一个班级表,包含班级和班级所在的教室,站在正常的业务逻辑中:如果班级没有名字,你不知道你在哪一个班级中;如果教室名字可以为空,就不知道在哪里进行上课。

如果在插入数据时,由于表进行了约束,不满足条件的数据不会插入进去,这就是约束!!!

二、默认值(default约束)
2.1 默认值的概念
默认值的概念:某一种数据会经常性的出现在某一个具体的值,可以在一开始就指定好,在需要真实数据的时候由用户选择性的使用默认值。

2.2 default的用法
defalut:数据在插入时不给该字段进行赋值, 就使用默认值。如果我们没有明确指定一列要插入,如果在建表中,对应列的默认值没有设置default值,无法直接进行插入。

2.3 default 和 not null 进行相互补充
当我们只对设有not null的字段没有进行插入数据,那么mysql会发送default错误提示。一个字段如果被default约束,我们也可以进行插入NULL,但是如果被not null进行约束,我们不可以插入NULL。

如果,我们在建立一个表的时候,没有建立所谓默认值,那么mysql会进行优化,默认带上default null。

三、列描述(comment)
3.1 comment的概念
概念:没有实际的含义,专门用于描述字段,互根据表创建语句保存,用来给程序员或者DBA进行了解每一个字段的含义。
3.2 comment的作用
相当于注释,但是通过desc命令查看不到任何注释信息,但是我们可以使用show来进行查看:

四、zerofill
4.1 解释int类型的后面的长度大小
在刚开始学习mysql时,很多人对数字类型后面的长度很迷茫,比如int类型是4个字节,但是在mysql中默认为10。因为int的字节数是4个字节所表示的数字的最大数是:21亿多,刚好数字的长度为10,所以int后面的数字为10;同理,有符号的int的长度为11,包含一个符号位。

4.2 comment的作用
显示方面的约束,当数字的位数小于所显示的位数,则用0去填充;如果数字的位数打掩护所显示的位数,则不用填充,也不需要进行比特位切割,主要做格式化显示。
4.3 zerofill的一些现象
在使用zerofill的前后,数据显示的对比:

zerofill只是一种显示格式,其中所能存储的数据的范围与后面的长度大小没有关系:

数据并没有进行改变:

五、主键
5.1 主键的概念
primary key用来唯一的约束该字段的数据,不能进行重复,不能为空,一张表中最多只能有一个主键。主键的列一般都是整数类型,比如:id,person_id......
5.2 主键约束
主键对应的字段不能重复,一旦重复,操作失败,不能进行插入。

5.3 主键的追加
cpp
alter table 表名 add primary key(字段列表);

5.4 主键的删除
cpp
alter table 表名 drop primary key; // 因为一张表中只有一个主键,所以直接删除即可

5.5 复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,则可以使用复合主键。

六、自增长(auto_increment)
当对应的字段不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 + 1操作,得到一个新的不同的值,通常和主键搭配使用,作为逻辑主键。很像之前在C语言阶段学习的联合体。
6.1 自增长的特点
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏必须是整数)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
6.2 索引
在关系型数据库中,索引是一种单独的,物理的对数据库表中一列或者多列的值进行排序的一种存储结构,它是某个表中一列或者若干列值的集合和相应的指向表中物理表示这些值的数据的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据你指针的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺着找到包含该值的行。这样可以使对应表中的SQL语句执行的更快,可快速访问数据库表中的特定信息。
七、唯一键(unique)
一张表中有往往很多的字段需要唯一性,数据不能进行过重复,但是一张表中只能有一个主键,唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质与主键差不多,唯一键允许为空,而且允许多个为空,空字段不做唯一性比较。主键不能为空。

唯一键与主键的区别:
- 主键更多的是表示唯一性
- 唯一键更多的是保证业务,不要和别的信息出现重复
八、外键
8.1 外键的概念
外键用于定义主表和从表之间的关系:外键约束定义在从表中,主表则必须是有主键约束或者unique约束
8.2 外键的语法
cpp
foreign key (字段名) references 主表(列)

8.3 如何理解外键约束
这个世界的数据大多是具有相关性
此时,在实际使用的时候,可能会出现什么问题?有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?比如比特只开了100班,101班,但是在上课的学生里面竟然有102班的学生(这个班目前并不存在),这很明显是有问题的。
解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。