欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > MySQL——4、表的约束

MySQL——4、表的约束

2025/5/18 9:42:29 来源:https://blog.csdn.net/Talon7/article/details/148014603  浏览:    关键词:MySQL——4、表的约束

表的约束

  • 1、空属性
  • 2、默认值
  • 3、列描述
  • 4、zerofill
  • 5、主键
  • 6、自增长
  • 7、唯一键
  • 8、外键
  • 9、综合案例

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表的约束很多,这里主要介绍如下几个: null/not null,default,comment,zerofill,primary key,auto_increment,unique key。

1、空属性

在这里插入图片描述
使用样例:创建一个myclass表,里面应该有哪个班级和哪个教室的信息,并且这两个信息一定是不能为空的。
在这里插入图片描述
如图,我们在class_name和class_room后面添加了not null约束,所以将来在插入的时候这两列属性不能为空。desc查看表结构的手,看Null这一列,可以看到这两个属性为NO,不允许插入NULL。而另一个属性other作为对比,我们没有设置not null,所以默认可以插入NULL。

在这里插入图片描述


2、默认值

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

使用样例:
在这里插入图片描述
上面我们创建了表t1,name属性设置非空约束,年龄age和性别gender设置了默认值。当将来用户如果插入对应的值,就用用户给的值,否则就采用默认值。
在这里插入图片描述

下面来看看默认值和空属性的关系:
在这里插入图片描述
在这里插入图片描述
由于name属性设置了not null约束,所以插入null是失败的。而当我们插入的时候,不制定name这一列属性,发现报错的是name这一列没有默认值。
如果我们没有明确指定一列要插入,用的是default,如果没有设置default就无法插入。

在这里插入图片描述
由于gender这一列设置的非空约束,所以我们也不能插入null。如果我们插入时不指定这一列,采用我们设置的默认值男,如果没有默认值就报错。
default和not null并不冲突,而是互相补充的。not null针对的是用户插入数据的时候,插入的是NULL还是合法数据。default针对的是用户忽略这一列的时候,使用默认值,如果没有设置默认值就直接报错。

在这里插入图片描述
当我们创建表t3,两个属性name个age,我们没有添加任何约束。然后向表中插入数据,我们并没有指定name这一列,正常来说由于没有指定,所以应该采用的是默认值,但是我们并没有设置默认值,所以应该报错,那么为什么这里没有报错了。我们查看建表时的信息,我们发现MySQL给我们做了优化,给我添加上了DEFAULT NULL,所以使用了默认值NULL。


3、列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

在这里插入图片描述


4、zerofill

在这里插入图片描述
如图,左侧是mysql比较老的版本,我们创建一个表t17,属性数据类型都是int,使用desc查看表结构的时候我们发现int后面跟了圆括号10。而在较新的mysql版本中已经没有显示了。那么这个圆括号10是什么意思呢?
在这里插入图片描述
首先向t5插入一行数据,然后查看,很符合我们的预期。接下来我们修改b的属性字段:
在这里插入图片描述
修改字段b的属性,添加zerofill,再次查看表结构,我们发现b这一列属性的数据类型为无符号的int(10)。再次查数据,发现b前面填充了9个0。我们再插入数据看看:
在这里插入图片描述
zerofill的作用:如果显示出来的数字位数小于括号里面的值,那么就会在前面补上0。

在这里插入图片描述
当数字位数大于括号里面的位数时正常显示,当不够时在前面补0。zerofill并不影响存储,只是影响显示的格式。


5、主键

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

使用样例:
在这里插入图片描述
我们可以给想要添加主键的列属性在后面加上primary key字段。建好表之后desc查看表结构,我们发现Key这一列多了PRI,表示该列属性是主键。并且我们注意到,主键这一列为非空属性,我们并没有主动添加非空约束,这是MySQL优化的结果。
接着我们插入数据试试看:
在这里插入图片描述
当我们插入相同的id值时,就会报错显示主键冲突,这是因为主键不能重复,是唯一的。所以有了主键,我们就可以根据主键找到相应的信息,进行增删查改。
在这里插入图片描述
我们刚才是在建表的时候,在数据类型后面跟primary key设置主键。我们也可以建好表之后再设置主键,下面我们先去除主键再设置:
在这里插入图片描述
去除主键很简单,直接在后面跟drop primary key即可。再次查看我们发现PRI不见了。

在这里插入图片描述
一张表中只能有一个主键,并不意味着一个表中的主键只能添加给一列。一个主键可以被添加到一列或者多列上,多列上的主键我们称为复合主键。
在这里插入图片描述
上图中我们创建了表t7,让学生学号id和课程编号course_id这两列成为主键,这样id和course_id组合起来就不能重复了。
在这里插入图片描述
在上图的插入过程中,我们发现id和course_id只要有任何一个不同都可以插入成功,而如果两个相同重复了就插入失败,也就是这两个合起来作为一个主键——复合主键。


6、自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
1、任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
2、自增长字段必须是整数。
3、一张表最多只能有一个自增长。

使用样例:
在这里插入图片描述
创建表t8,给id属性添加主键和自增长。

在这里插入图片描述
由于id设置了主键+自增长,所以插入的时候我们可以不指定id这一列。自动从1开始增长。

在这里插入图片描述
当我们指定插入1000之后,再次插入下次就是从1001开始了。我们通过show create table查看,可以发现有个AUTO_INCREMENT=1002,所以下次插入如果没有指定的话,自动插入1002。

基于上面的原因,我们可以创个表t9,属性一样,只不过我们在最后设置auto_increment=500,那么我们插入数据的时候不指定列,自动就从500开始自增长。
在这里插入图片描述

在插入后获取上次插入的auto_increment的值,可以使用last_select_id()。
在这里插入图片描述

有关索引:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。


7、唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。关于唯一键和主键的区别:我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

在这里插入图片描述
我们在数据类型后面添加unique key,表示给该属性添加唯一键。desc查看表结构,发现对应Key这一列有UNI。

在这里插入图片描述
我们再插入的时候发现,唯一键也是具有唯一性的,重复的数据无法插入。但是唯一键可以插入NULL!而对于主键来说,数据不能重复且不能插入NULL。

在这里插入图片描述
在上面我们创建一个表用来存储学生的信息,比如学号、姓名、电话号码。
接着我们插入一些信息:
在这里插入图片描述
但是由于粗心操作,导致插入了重复的电话号码,这样就会出问题。因为我们知道电话号码每个都是不同的,具有唯一性,因此我们可以给电话号码设置唯一键,保证它具有唯一性。
所以实际上建表我们应该这样建:
在这里插入图片描述
也可以像下面这样在最后添加:
在这里插入图片描述

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。
主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。


8、外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
在这里插入图片描述

在这里插入图片描述
初识外键:
首先创建两张表,学生表student和班级表class
在这里插入图片描述
接着插入一些数据:
在这里插入图片描述
一般是现有班级才有学生,所以先插入班级信息,接着插入学生信息,student表中张三通过class_id=1与class表中id=1的通信101班级进行关联。

在这里插入图片描述
接着继续插入四条信息,前面三条都没有问题,但是最后插入田七的时候,粗心导致了田七的班级id为3。但是我们班级表中并没有id为3的班级,这肯定是有问题的,因为田七不能隶属于一个不存在的班级。所以我们需要通过一定的手段规避这样的问题。
另外还有一种情况,我们把班级表中id=1的班级信息删除了,那么在student中隶属于id=1的班级的学生还是存在的,这还是存在跟上面一样的问题。因为我们再去查找class表信息的时候已经不存在id=1的班级了。

在这里插入图片描述
所以,在目前的情况下,我们可以正常插入不存在班级id的学生信息,也可以随意的删除class中的班级信息,这是不符合逻辑的。
怎么解决呢?一个是我们程序员自己去维护,插入数据之前看看有没有存在对应的班级,删除班级前把学生表中隶属于该班级的学生全部删掉,但是这样做很麻烦。

我们刚才创建的两张表student和class是有外键之名的,class作为主表,student作为从表,从表student中有class_id与主表class中的id进行关联。而外键需要有关联和约束关系,class_id具有外键之名,因为class_id有关联关系,但是没有外键之实,因为没有约束。
什么是约束?当没有对应的班级id,那么mysql就不应该让我们进行插入操作。

所以我们删除student表,重新创建,并实现外键。
在这里插入图片描述

下面当我们插入不存在的班级id时,MySQL就不允许我们插入:
在这里插入图片描述

而当我们要删除id=1的班级信息时,也是无法删除的,因为从表student中还有学生隶属于这个班级:
在这里插入图片描述

当我们把班级隶属于id=1的学生全部删除后,再去删除id=1的班级信息就可以删除了:
在这里插入图片描述

最后,我们可以看到下面的外键前面还有constraint,表明给外键约束起名字。
在这里插入图片描述


9、综合案例

在这里插入图片描述
在这里插入图片描述

版权声明:

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

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

热搜词