文章目录
- 表的约束的介绍
- 外键约束
- 测试
- 建表
- 插入测试
- 建表
- 插入测试
- 理解外键约束
表的约束的介绍
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。
外键约束
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
测试
建表
学生信息表
班级信息表
插入测试
插入班级的id和名字
插入学生信息
但是这里会发现一个问题我们的班级信息表里面并没有id为3的班级,所以添加班级信息的规则不符合逻辑
这里我们删除了通信101但是这是又有一个问题,通信101班级里面还有学生啊。这怎么可以删除,只有空班级才可以删除。
所以删除班级的规则也不符合逻辑
这里 class2为主表,stus为从表,class_id有外键之名(有关联),但是无外键之实(无约束)。
所以要添加外键约束。
建表
重新建立有外键约束的表
插入测试
先查看主表和从表
从表 插入数据
我们看到了插入受到了约束,因为班级表里面没有id为3的班级,所以从表插入是也不允许有id为3的班级。
现在我们班级里面还有学生我们还能删除班级吗?
我们会发现不允许删除了。
如果班级里面没有学生我们可以删除吗?
我们会发现空人数的班级是可以删除的。
外键作用:
1.主表和从表的关联关系
2.产生外键约束
理解外键约束
首先我们承认,这个世界是数据很多都是相关性的。
理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。
此时,在实际使用的时候,可能会出现什么问题?
有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?
比如学校只开了通信100班,通信101班,但是在上课的学生里面竟然有通信102班的学生(这个班目前并不存在),这很明显是有问题的。
因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。
解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。