MySQL之表的约束

 

 

目录

一 空属性

定义

如何设置

 示例

影响:

二 默认值

定义

示例

影响:

三 列描述

定义

示例

 影响:

四 zerofill

定义:

示例:

影响:

五 主键

定义

主键的性质是什么:

为什么要有主键:

约束体现:

我们如何去设置一个主键?

复合主键

主键约束:

应用场景:

六 自增长

自增长是什么:

特点:

如何使用

 效果

七 唯一键

唯一键是什么:

特点:

 为什么要有唯一键:

和主键的关系:

如何设置

 约束体现:​编辑

八 外键

外键是什么:

为什么要有外键

要求:

理解:

测试一下外键约束


在讲之前数据类型的时候,我们已经知道数据类型其实本质上就是一种约束。但是只有这一种数据类型的约束实际上是非常单一的,因此,为了更好地保证数据的合法性,我们就引入了其他的约束。(这是非功能性的一些约束,目的是为了让数据更加合法)

这些都是对字段值的约束,也就是说我们设计列的时候会有对应的约束,约束我们插入的数据的合法性

主要从空属性,默认值,列描述,zerfill,主键,自增长,唯一键和外键来进行介绍。

一 空属性

定义

 

空属性就是对应的Null的描述,标识字段值是否可以为空。如果是Yes的话,标识该字段值可以为空。也就是我们可以不插入数据;否则,如果是No的话,就表示我们一定要插入数据,否则数据库就会报错,阻止该条数据插入,因为不符合对应的规范

注意以下三者的区分:

0:有,但是对应的是一个数字,并且这个数字的值是0

字符‘ ’:有,但是对应的是一个字符串,这个字符串是空的

Null:无 没有

 当我们新增一列的时候,如果没有指定这样的属性,默认的就是可以为空。但是在实际的开发过程中,有一些数值是绝对不能为空的,这个时候就需要我们手动去设计了。

如何设置

只要在设置属性列的时候显示地指出,这样子就不允许为空了

 示例

 这样我们两个值都必须插入才可以

影响:

对于设置了非空属性的列,那么我们在插入数据的时候,就必须不能为空;

那么数据表中存储的数据都是非空的

二 默认值

定义

default:设置了这个默认值,即使我们如果显示地指定该数据是多少,那么最终就会使我们选择的默认值。因此对于经常性出现的某一个具体的值,我们就可以在一开始设定好。

示例

我们来尝试试用一下

 

创建一个这样的表,

 

 

 

插入两条数据,我们就可以看到,对于没有设置的地方,自动被填充了对应的值

影响:

插入列的时候我们可以选择省略插入对应的数据,这样子就会去使用默认值。有这个约束的话,其实约束就降低了。设置了default可以保证数据的完整性,对于一些常用的字段,用户没有必要显示设置,但是确实数据库又需要,这个时候我们设置了default就可以省去一些重复的操作,又可以保证数据的完整性

not null和default可以同时设置吗?

这两个约束看上去是有点矛盾的,因为如果有默认值的话,这一列肯定是不为空的。这样不就和非空冲突了吗?

其实不是这样子的,设置这样的约束实际上只是为了防止插入中的一种情况:插入空值。

对于这样同时设置这一组约束我们可以这样理解:

起作用的时间来看,

对于Null,我们显示地向一列插入的时候作用的。如果插入的是正常的值就会正常显示,否则就会受到约束

对于default,在不显示的向指定列插入的时候,default才会自动起效果

从插入的情况来看

那么会不会有这样一种情况,设置了null的,我们去插入,但是插入的是null值?对于这一种情况就同时设置这两个属性来保证约束

但是实际上这样使用的很少,只是说有这样的一种情况

三 列描述

定义

设置的列描述其实在实际的数据库中相当于一个注释。我们设置了comment是给其他的数据库操作员来看的。

并且这个注释只有通过show才能查看

示例

 影响:

给其他程序员查看对应的规范

四 zerofill

定义:

这个东西需要和整型一起使用,主要是用来规定长度的,标识这个整型只有多少多少位的数字,如果不满足这个位数就用0来填充。但是数据库中实际存储的还是没有0的值,只是现实的时候这样显示

示例:

 

影响:

格式化输出。必须要配合int的位数来使用,不设置zerofill的话,单元格的长度是不一样的,但是如果设置了,表的单元格大小就是一样的,这样就可以边界对齐。

需要注意的是,

对于有符号的int,11位最大;对于无符号的是10位最大。这取决于一个整数的取值范围,无论是有符号还是无符号的,都是2^32-1 10位就可以显示出整数范围内的所有数字了。因此除了显示的所有数字还要看是否有带上符号的

五 主键

什么是主键,主键的性质是什么,为什么要有主键,我们如何去设置一个主键,主键的应用场景有哪些

定义

主键是一种约束,primary key,被设置了为主键的对应属性值具有一些特殊的性质。

主键的性质是什么:

主键非空且唯一。也就是说,被标识了主键,天然就具有这样的性质,那么我们在插入的时候,也要遵循对应的规范,否则就无法插入。

一张表中最多只有一个主键,可以没有,但是如果有主键只能有一个。并且主键通常是整数类型的一个数。

这也就体现了主键对程序员的约束,主键设置之后,对存储的数据的约束。

为什么要有主键:

方便定位,进行相关的操作。当我们表中有大量数据的时候,比较难以定位,这个时候我们就应该要有一个能确保数据唯一性的键值,方便我们去定位。

约束体现:

设置主键之后,对于查找,查找时候是通过key值进行查找的,而主键就是一种最重要的键值,可以起到区分的作用

插入的时候,我们会去比对对应的主键值,如果主键值是重复的,或者为空的,就不允许插入。

删除的时候也是同理的,我们通过key定位之后再删除。

我们如何去设置一个主键?

1 如果主键只有一个列的话(不是复合主键),可以直接跟在列后指明

经过mysqld,会被修改成这样的语句

 

自动被设置成了非空的

2 写在最后(同样适用于复合主键的)

 

 体现的约束

不能重复,不能为空

因此,这些约束我们在设计表的时候就要去想好,后期修改是比较麻烦的

复合主键

如果有多个值共同构成键值,这样就是复合主键

我们在什么时候用到?

比如,学生选课的时候,不允许一名学生把一门课选多次,这样子,需要同时去标定学生和课程对应的唯一性,就需要由复合主键来实现

 

 

主键约束:

主键的约束对两个属性同时起作用的,他们中的任何一个都是不能为空的;

另外,复合主键一起构成主键,因此只有两个键值同时冲突才不能插入数据。

在现实生活中,对应的就是(一个学生可以选其他的课,一个课也可以被其他学生选择)

应用场景:

通常需要结合业务选择一个与业务无关的唯一值

结合业务:数据的合法性,比如电话号码这些,就是唯一的。

选择与业务无关的唯一值:插入的话,上层业务修改,主键不会大改,就实现了表的结构和业务的解耦,业务不影响整体主键的表结构。

六 自增长

自增长是什么,有什么特点,如何设置,在什么情况下使用

自增长是什么:

auto_increment 如果设置了这样的约束,我们不给对应的值,也会被系统自动触发,系统中在上一个自增长的基础上+1,得到一个新的值,被设计进对应的记录中。一旦被设置了这样的约束,就是主键。

特点:

1 一般是整数

2 被设置了就是主键,因此一张表最多只能有1个

3 如果我们建好表,并且插入数据之后要去设置自增长,前提是它本身就应该key有值(索引)

关于索引:

相当于目录,可以加速我们检索速度。

本质:用空间换时间,原来相同的空间可以存储更多数据,但是用一部分的数据保存对应数据的值,这样就可以快速索引。

作用:加速对于mysql的查找

如何使用

我们必须要同时定义主键和自增

 

 效果

 确实是每一次使用需要从上一次的保存处拼接的

我们也可以断崖式地新增一个数据,这样子自增值自动跟着最大的我们新设置的更新。后续除非手动插入值,否则auto_increment的值不会再变小了

 因此:

1 不指明,连续1234……

2 指明最大的值:跟着最大值更新

七 唯一键

唯一键是什么,为什么要有唯一键,我们日常生活中怎么使用唯一键,如何设置唯一键,从业务的角度理解唯一键和主键的关系

唯一键是什么:

unique:用来标识属性唯一的约束

特点:

用来标识唯一性,可以为空

 为什么要有唯一键:

设置唯一键,是用来标识唯一性的。一个表中只能有一个属性,但是我们现实生活中的物体,往往具有很多属性,并且这些属性可能并不只有一个属性是唯一的。那么我们需要维护这些非主键属性的唯一性,就要使用唯一键来约束

数据库设置了这样的约束,就不允许在具有唯一性的地方插入相同的值,MySQL的层面保证了唯一性,防止用户误操作;

同时也保证了表的完整性和规范性:不会有相同的QQ号码……

和主键的关系:

主要从业务层面去理解

主键:快速索引,非空唯一。

唯一键:唯一可以不为空。在现实世界中不要和别的数据发生冲突,本身不参与mysql计算,不会有冲突的问题,因此可以为空。

比如我们设置学生信息表的时候,有学号,姓名,qq,邮箱等信息。设置了学号作为主键,是唯一的。但是qq号也是唯一的呀,也需要这样的维护,这时候我们就可以设置唯一键。让这个表的约束更加的规范完整。

如何设置

 约束体现:

唯一键如果设置了非空约束的话,姑且可以认为和主键的功能是一样的。(当然有差别,之后会在索引体现)

八 外键

外键是什么,为什么要有外键,如何使用外键,对于外键的理解

外键是什么:

以上的约束都主要用来定义表内部的结构,那么对于表和表之间的关系,外键就不能简单地从表内部来理解了,需要结合表和表。外键维护主表和从表的关系。被设置了外键的表就是从表,主表必须要有主键约束或者unique约束。

标识一种隶属关系。

比如多名学生隶属于一个班级,我们用两个表分别表示学生和班级,为了标识这个关系,还需要对学生表设置外键。

为什么要有外键

我们的数据库是基于需求诞生的。我们现实生活中有很多事务,这些事务有很多特征。除此之外,事务和事务之间还有很多关系。表的结构需要体现业务的关系,这些关系需要用外键来描述。这个外界的关系,体现在mysql中就是对应的外键约束

描述关系

要求:

有定义成外键约束的就是从表,依赖的另外的表就是主表,

被定义成外键的一般要具有唯一性,方便映射,因此一般是主键或者唯一键

理解:

外键要从两个方面理解:

关系+约束

比如我们定义了外键,就会对应的有这样的约束(假设有学生表和班级表,班级表中的班级号是学生表的外键)

·必须要先有班级才会有对应的学生

·要删除班级的前提是该班级没有学生

·不能把学生对应的班级修改成一个不存在的班级

……

这些约束就是由外键来维护的

这一种方案既帮我们维护了关系,又有对应的约束,这些约束就不用程序员手动去维护了。因为mysql会拦截不合法的操作。

有了外键约束,表的完整性和规范性都得到了保障。非法的数据直接从数据库层面进行拦截了

总结

外键是什么:

关系+约束

外键不仅仅是产生表之间的关联的,还有重要的属性往往被人忽略:外键在mysql中还具有特定的约束规则,来保证表和表之间的数据的完整性和一致性

测试一下外键约束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值