您的位置:首页 > 财经 > 产业 > 高端网站设计百家号_门户网站建站目标_免费换友情链接_seo课程培训学校

高端网站设计百家号_门户网站建站目标_免费换友情链接_seo课程培训学校

2025/4/13 2:58:54 来源:https://blog.csdn.net/2301_80277275/article/details/146326595  浏览:    关键词:高端网站设计百家号_门户网站建站目标_免费换友情链接_seo课程培训学校
高端网站设计百家号_门户网站建站目标_免费换友情链接_seo课程培训学校

目录

非空约束

默认值default

列描述comment

zerofill

主键

自增长

唯一键

外键


真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。表的约束就是为了保证数据的合法性(向文件写入时是没有任何约束的,想怎么写就怎么写)。有了约束之后,未来插入数据库表中的数据都是符合预期的。当我们desc查看一个表时,后面的字段就是约束。

约束的最终目标:保证数据的完整性和可预期性

非空约束

在MySQL中,NULL是没有的意思,与0、'\0'等不同,这是与C/C++不同的。在MySQL中,NULL与''也是不同的,NULL是什么都没有,而''代表的是一个字符串,只是这个字符串什么都没有。在MySQL中,''和""均可表示字符串。且MySQL中,大小写不作区分。
非空约束是说明这一列是否可以为NULL的



我们创建表时,在数据类型的后面加上not null就是给这个列加上了非空约束。可以通过desc查看得出,NULL是NO说明这一列不能为空,也就是不能不插入,且插入的值不能为NULL

我们对表进行一些操作


可以看到,没有非空约束的列,是可以不对这一列进行插入的,此时会默认这一列的值为NULL,当然也可以对这一列插入NULL。具有非空约束的列,不能不插入,且插入的值不能为NULL。但是要注意,当我们对具有非空约束的列进行插入时,在我们不插入时,报的错为没有缺省值,只有当我们插入的值为NULL时,报的错才是因为非空约束。所以,有了非空约束,未来插入进来的值一定是有具体的值的

默认值default

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。实际上,就是缺省值。


可以看到,当我们不向有默认值的列插入数据时,这一列就会使用默认值,当我们向有缺省值的列插入数据时,这一列就会使用我们插入的数据。

非空约束与default的比较

非空约束与default单独看都是比较简单的,但是两者是需要作出一些区分的


可以看到,具有非空约束而没有default的列,当我们插入NULL时,是被非空约束所约束;当我们不对这一列进行插入时,是被default所约束。具有default而没有非空约束的列,我们可以插入NULL,也可以不对这一列进行插入,此时会使用默认值。具有非空约束,又具有default的列,我们不可以插入NULL,但可以不对这一列进行插入,此时会使用默认值。所以,非空约束和default不会冲突,而是互相补充的,因为两者的作用点不同

约束描述
非空约束作用点是用户想插入的时候,此时就两者值,合法数据和NULL
default作用点是用户不想插入的时候,如果设置了默认值,插入成功,否则插入失败



我们会发现,我们没有设置default也是可以使用默认值的

这是因为MySQL做的优化。若加了非空约束,则不会有这个优化。

虽然我们对非空约束和default作出了比较,也明白了两者的区别,但是要注意的是,一般情况下,两者是不会一起使用的。

列描述comment

不会影响任何增删查改的操作,专门用来描述字段。


使用desc是看不到描述字段的,需要通过查看创建表时的语句才能看到

zerofill

zerofill是一个关于显示的约束。我们前面在介绍数据类型时,int类型的后面总有一个括号,并且括号内还有一个数字,这个数字是什么呢?


我们创建一个表,这个表里面有两个int类型的数据,我们在建表时并没有给int后面带上(10),但是建完表之后可以看到有,这是MySQL在建表时添加的优化。

我们向这个表中插入一些数据

我们现在给b加上zerofill约束


可以看到,此时b被自动填充了0

可以看到,添加了zerofill约束后,对于插入的值,在查看时前面会自动补上0。这正是zerofill的作用。给某一列添加上zerofill约束后,若在这一列插入的值的宽度小于设定的宽度,那么在显示时会自动在前面补上0。当然,数据库中保存的数仍然是原来的数,只是在显示时才会添加上0。所以,zerofill是关于显示的约束。


可以看到,我们使用b = 200是可以查找出来的,所以数据库内部存储仍然是使用原来的数,只是在显示时才会添加上0。

我们也可以使用hex来验证,hex是将一个表中的某一列转换成十六进制显示

C8就是200

有了zerofill后,我们就可以让某一列等宽,如教室的编号是1到100,我们就可以让它们在显示时是001到100,这样就更加美观

我们修改b括号内的值,将其调小一点,看看当我们插入的数的宽度大于括号内的数时,是如何显示的。


可以看到,插入的数的宽度小于设定的宽度时才会补0,若宽度大于等于设定的宽度并不会补0。所以,zerofill就是作格式化显示的

我们来看看有符号的int和无符号的int在默认情况下括号内的数字是几。

可以看到,有符号的int在默认情况下括号内的数字是11,无符号的int在默认情况下括号内的数字是10。这是因为无论是有符号,还是无符号,在十进制下,能表示的最大值都是十位数,这样就能表示出整数范围内的所有数了。有符号的会多一位,这一位是符号位。

主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

我们创建一个存放学生信息的表格,对于每一个学生,学号都是唯一的,所以我们可以将学号设置为这个表格的主键


当我们使用desc查看一个表的信息时,Key这一列中的PRI就说明这一列时主键。我们并没有给主键这一列加上非空约束,但是建完表之后查看时发现这一列是有非空约束的,这是因为MySQL作出的优化。并且可以看到,给某一列添加主键不一定是要在这一列的后面写上primary key,也可以在下面primary key('id')

作为主键的这一列,里面的数值不能重复、不能为空。

添加主键的方式:1.建表时就添加    2.建表完成之后再添加
虽然有两种添加主键的方式,但是建议是在使用表之前就将主键确定下来

我们现在先将t14这个表中的主键删除

删除主键时是不需要指定那一列的,因为只有一列是有主键的
我们给id这一列插入一个重复的值

现在id这一列就有了重复的值,我们再给这一列添加主键

可以看到此时添加主键是失败的。所以,在建表完成之后添加主键时,这一列必须不能有空和重复。所以,最好在使用表之前就将主键确定下来。

我们现在将id中重复的值删除后,就可以添加上主键了

复合主键

前面说了,一张表中只能有一个主键,但这并不意味着一个表中的主键只能添加给一列,一个主键可以被添加给一列或多列,当添加给多列时,这多列合起来才叫做一个主键,也称为复合主键

我们创建一个学生选课及选课成绩的表,其中有3列,id表示学生的学号,course_id表示课程编号,score表示学生的成绩。我们允许一名学生选多门课程,也允许多名学生选同一门课程,但不允许一名学生多次选同一门课程,所以我们可以将id和course_id设置为主键。这样单独看id或course_id都不叫主键,只有两列合在一起才叫主键。


可以看到,id这一列重复没事,course_id重复没事,只有当id和course_id都重复时才会无法插入

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

注意:只有主键或唯一键的列能够设置自增长。不是主键或唯一键的列设置自增长建表是不会成功

创建一个表,让这个表的id为主键,并设置自增长。此时我们向这个表中插入数据时,可以不向id列插入,会自动按id这一列的最大值+1进行插入

当然,我们也时可以显示在这一列插入的

当我们显示插入时,改变了这一列的最大值,所以下一次插入的值也会发生变化
为什么表知道下一个插入几呢?

因为表外有一个auto_increment的值,这个值存的值就是下一个插入的值。我们在建表时时可以指定自增长的起始值的,就是设置auto_increment的值

可以使用last_insert_id函数获取最近一次insert操作生成的自增 ID 值

唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。


我们将id这一列设置为唯一键,设置成功后,Key这一列中就会有个UNI。创建唯一键时,可以使用unique,也可以使用unique key。

可以看到,唯一键不允许重复,但是允许为空,并且允许多个为空

假设我们现在要创建一张学生信息表,这张表中有学生的学号、姓名、电话号码、QQ,我们以学生的学号为主键,很明显,电话号码和QQ同样都是不允许重复的,如果重复了一定错了,所以,我们可以将电话号码和QQ设置为唯一键。

我们也可以给唯一键设置为非空,这样唯一键与主键就飞涨像了

所以,唯一键和主键并不冲突,而是互相补充的。一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。假设我们有一个学生表,用于存储学生的相关信息,比如学生的姓名、年龄、班级等。使用和业务相关的字段作为主键。我们可能会想到使用学生的学号作为主键,因为学号在学校系统中是每个学生唯一的标识。假设现在的业务需求是记录每个学生的基本信息和考试成绩等。但是,如果学校的业务发生了调整,比如学校决定改变学号的编码规则(例如原本是 6 位数字的学号,现在要改成 8 位,包含入学年份等更多信息),那么这个学号字段作为主键就会受到很大影响。因为主键是用于唯一标识表中每一行记录的,如果主键值发生变化,那么与这个学生相关的所有关联数据(比如成绩表中关联学生的记录)都需要进行相应的修改,以保持数据的一致性。这会带来大量的数据更新操作,可能还会增加数据出错的风险。使用和业务无关的字段作为主键。我们可以设计一个自增的整数类型字段,比如 student_id 作为主键。这个 student_id 字段与学生的具体业务信息(如学号、姓名等)没有直接关系,它仅仅是一个唯一的标识符。当学校业务发生调整时,比如学号编码规则改变或者学生的其他业务信息有变动,这个 student_id 主键字段不需要做任何改变。其他表(如成绩表)与学生表通过 student_id 进行关联,由于 student_id 保持不变,那么相关联的数据也就不需要因为业务调整而对主键关联部分进行修改,大大减少了因为业务变化对数据库结构和数据关联的影响。

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
外键强调的是表与表之间的关系,外键包括关联 + 约束

假设我们现在要创建一个学生信息表,这个表中包含了学生的基本信息,同时还需要有这个学生的班级信息,一个学生一定会隶属于一个班级,但是一个班级会有很多个学生,如果我们将学生的班级信息直接存放在学生的信息表中,会造成大量的数据冗余,所以,我们可以额外创建一个班级信息表,并在学生信息表中加上一列class_id,让其与班级信息表中的id这一列进行关联(id这一列是班级信息表的主键)。像这样,用一个特殊的列属性与其他表产生关联,这一列就是"外键",当然此时的"外键"并不完整,完整的待会会介绍。在这里,班级信息表是主表,学生信息表是从表。所以,外键是在从表建立的,主表中与外键产生关联的一般是主键或唯一键。

我们向这两个表中插入一些数据



此时会发现两个问题

  • 学生表中的class_id不应该出现不在班级表中的班级
  • 若一个班级中还有学生,应当不允许删除班级表中的这个班级

为了防止出现上面两种异常情况,就要求程序员在操作之前先查一查表,这显然是十分麻烦的。实际上,我们刚刚的外键只有外键之名(关联关系),没有外键之实(约束)!我们前面说过,外键是关联 + 约束。关联就是从表和主表中能够根据两列关联起来,其中主表的这一列一定要是主键或唯一键;约束就需要手动添加。

我们现在重新创建表student,并给其与class建立外键约束

Key中有MUL就代表这一列是外键

有了外键约束后,就无法向一个不存在的班级插入了

并且,当一个班级还有学生时,也无法将这个班级删除

外键 = 关联 + 约束
所以,外键就是在从表中多设计一列,让这一列与主表中的主键或唯一键产生关联。并在建从表时加上外键约束。

MySQL约束的核心意义

  • 保证数据正确性:防止错误数据入库(如非空约束、数据类型约束)
  • 强制数据唯一性:避免重复(如主键、唯一键)
  • 维护表间关系:确保外键关联有效(如外键约束)
  • 自动校验规则:数据库自动检查数据,减少应用层代码负担

一句话总结:约束是数据库的“守门员”,确保数据合法、一致且可靠

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com