MySQL表的约束

本文详细解释了MySQL中的各种约束,包括非空约束、默认值约束、主键约束、外键约束和唯一键,强调了这些约束如何确保数据完整性和一致性,有助于提升数据库管理效率。
摘要由CSDN通过智能技术生成

什么是约束

约束随处可见,无论是我们使用C++或者Java写代码时,还是使用MySQL建表的时候,都会遇见约束,比如写代码时如果出现语法错误,那么就无法编译通过,这就是约束的表现。

约束自身,实际上就是通过技术手段,来使程序员的代码具有完整性和可预期性。

数据库的约束实际上就是数据类型,但是仅仅只有数据类型是不够的,因此还有一些额外的约束,

来保证数据的合法性,数据的正确性。      

本次我们就来学习MySQL中除了数据以外的一些约束。

空属性约束

在MySQL中NULL表示为空,也就是该位置的值为空,而我们表中的数据有的属性的值不能为空,有的可以为空,因此MySQL给表添加了一种约束,在程序猿建表的时候,可以设定某些属性的值不能为空。

语法:属性名 datatype not null/null                not null 表示该属性不可为空null表示可以为空,如果属性后面没有跟着约束,默认可以为空。

比如我这里创建一个学生表,学生的学号以及姓名是不能为空的,因此这里设定为不可为空。

 

通过desc查看该表的属性,可以看到 NULL 一列中前两个为 NO,最后一个为YES。

表示插入的数据前两个必须不为空。

比如我这里显示插入一条数据,该数据只有 id 和 name ,插入成功后,查看数据,birthday的值为NULL。

而当我们插入的时候没有指定要插入name时,它的报错是name 没有默认值,这就需要了解默认值约束了。 

默认值约束

就像C++定义函数或者类时,我们建表的时候可以设定某一个属性是否带默认值。

语法:xxx属性 datatype default xxx            加粗的default是关键字,后面跟着默认值。

而MySQL有一个贴心的优化,当我们建表时,如果没有带默认值和not null 约束时,那么MySQL会自动在属性后面添加 default null 约束,我们可以实验一下。

第一个属性和第三个属性都没有带默认值和not null 约束,只有第二个属性带了not null 约束。

 通过 show create table Default_test 命令可以看到,确实添加了 Default NULL 的约束。

这样我们向表中插入数据时,如果没有指定第一个属性和第三个属性的值,那么插入的属性的值一定为NULL。

 当然我们可以自己设定默认值。

然后我们试着插入数据。

 

通过几次插入我们得出几个规律。

  • 当属性有默认值时,且用户没有显式插入时,那么数据库会采用默认值
  • 当属性有默认值时,用户有显式插入,但是用户没有给数据时就会报错
  • 当属性有默认值时,用户有显式插入,且用户给了数据,就采用用户的数据
  • 当属性添加了非空约束时,如果用户没有显式插入,且默认值不为NULL时,mysql会采用默认值

 从上面我们得出一个结论,空属性约束和默认值约束二者并不冲突,而是互相补充的。

not null 作用于当用户插入数据时,如果是null就报错,如果是非空就是合法数据。

default 作用于用户忽略某一列时,如果设置了默认值就采用默认值,没有默认值就报错,如果没有忽略某一列而且没有设置值时,就会直接报错。

 列描述约束

列描述约束准确来说并不算一个描述,因为它只是一个相当于注释的一个东西,相当于软性的约束

语法:xxx名 datatype comment ‘xxx注释’;                comment是一个关键字,后面跟着描述

 一般只能通过show create table 才能看到列描述约束。

zerofill约束

zerofill主要针对的是int类型的属性,当我们建表时,我们可以看到,int后面跟着一个数字,之前一直没有讲过这个数字的作用,是因为这个数字必须跟着zerofill约束才有用,否则就没用了。

语法: xxx属性名 int zerofill;             在int类型后添加zerofill即可。

根据mysql版本不同,有的int后面有数字,有的没有。 

当我们创建一个带有zerofill约束的表后,插入数据会变成什么样呢?

 我们发现,没带zerofill约束的属性a是普通的10,而带了zerofill约束的属性b在10前面补了8个0;

此时我们就能得出结论:

int 后面的数字 n 就是当带有 zerofill 约束时,如果插入的数据不足 n 时,就会在前面补0

那么如果 b 这个数字的位数超过了 n 呢?

  我们先修改b属性的数字n为4.

然后插入数据,发现如果插入数据的位数超过 n 也没事,只有没有到 n 才会补0;

当然,无论前面补没补0,实际上存储的都是对应的数据,只不过zerofill 在显式的时候会将数据格式化后再显示。

主键

在日常生活中,我们总有一种属性能够作为唯一的标识,在数据库中这种标识就是就是主键。

就比如一个学生应该有一个学号作为标识,我们建表的时候有需要也要考虑这种唯一的标识。

语法:xxx属性名 datatype primary key;

主键是用来唯一约束该字段的数据,不可重复,不可为空,一张表最多有一个主键,一般主键所在列的类型是整型。

当我们插入数据时,就需要注意主键不能重复。

当然,如果建表的时候,忘记设定主键了,我们也可以自己设定, 或者说主键设置错了,我们也可以删除该元素的主键属性。

删除主键属性

语法:alter table table名 drop primary key;

因为在create的时候,我们能够发现mysql设定主键属性是在后面添加 primary key (xx属性名) 来设定主键属性,当然我们也可以用修改表的方式来将这个语句给 drop 掉。

drop 主键属性后,我们就能够插入重复 id 的数据。

 

但是此时如果我们还想设置 id 为主键,那么就会出错。

这是因为表中有两个 id 一样的数据,会出现主键冲突,只有删除某一个数据才能设置。

因此我们需要知道,如果没有设置主键的表,需要在确定不需要主键后再插入数据,否则就会出现上面这种错误。 

添加主键属性

在删除 id = 1的重复数据后,才能添加主键属性。

语法:alter table table_name add primary key(id);

复合主键

在现实生活中,如果只有一个属性作为主键也许不够,比如学生选课的数据库,一个学生肯定不能只选择一门课,也许一个学生有好几门课,因此我们需要让学号和课程号两个属性作为主键,这就是复合主键。

这并没有破坏主键只有一个的规则,因为这是说 多个属性共同组成主键,按多个属性来区分是否重复。

语法: primary key (属性1,属性2...)                          这样括号里面的属性就共同组成主键

 

 这样就创建一个包含复合主键的表了。

这样即便 id 相同,也依旧可以插入,因为主键是 id 和 course 共同组成的。

自增长

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

特点

  • 任何一个字段要自增长,它本身必须是一个索引,即在key那一栏有值
  • 自增长字段是整数
  • 一张表只能有一个自增长

 必须要是整形且是一个索引才能是自增长。

这样我们插入的时候就会发现,id如果不给值,它依旧会自增长。

 不过如果我们插入了一个新值,且该新值在之前没有出现,那么下一次增长就从新值开始增长。

 此外,我们也可以在建表的时候手动设置 auto_increment 的初始值。

通过查看表的创建语句,可以发现,mysql自动给表后面添加了 AUTO_INCREMENT=102的字段,也就是说下一次插入的数据,如果id值没有设置的话,那么就会从102开始增长。

这里我创建一个表,设定自增长从100开始,可以看到确实是从100开始增长的。

 在上面我们也说过,自增长的前提需要该属性自己是一个索引,而索引也就是属性中的key,这里我测试的都是key为primary key(主键) 的索引的值,当然我们还有其他索引,不过那都是后话了

唯一键

在实际的生活中,很多属性都具有唯一性,比如学生的学号,手机号,qq号等,但是显然,这些并不能都是主键,因此mysql 退出了和主键类似的唯一键,方便用户根据不同场景使用不同的约束。

唯一键

本质和主键差不多,不过唯一键允许为空,而且可以多个为空,如果是空值就不做比较。

它和主键的区别在于主键更多标识唯一性,而唯一键更多保证在业务上,不和其他信息重复

 语法; xxx名 datatype unique;                                                  unique是一个关键字。

接下来我们创建一个学生表,用来理解唯一性的作用。

比如我这里创建一个学生表,它的信息包括学号,qq号以及手机号。

但是我们也许只要求学号一定存在,而qq号和手机号也许可以不用存在,只要求qq号,手机号和学号一一对应,不会重复即可,因此我们可以这样设置。

 

唯一键的属性它的值不可相同,但是我们可以忽略不插入这个值。

 就好像现实生活中,一个学生肯定有他对应的学号,但是学校方也许不知道他的qq号和手机号,这种情况下就需要唯一键的存在了。

唯一键不仅能够保证数据的唯一性,同时它为空也不会报错。

外键

在现实生活中,也许会出现一个表的内容依附于另一个表的情况。

比如一个学生表,它的基本属性除了学号,姓名,还会有该学生所在班级的班级号之类的属性。

如果是一个学生表内包含有班级号,而对这个班级号没有任何约束可能会出现一个学生在一个不存在的班级的情况。

比如一个班级表里有1班和2班,但是有一个学生他的数据库中记录他所在班级在3班,这明显是错误的,而这种错误单靠主键,唯一键是解决不了的,因此mysql推出了外键,用来针对这种情况。

语法:foreign key (字段名) references 主表(列),         

在从表中设定某一字段依附于主表的某一属性,这样这个字段就被设定成了外键

  • 主表:从表所依附的表
  • 从表:某一属性需要根据其他表的某一属性来设定的表
  • 一般外键所依附的那个属性必须是主表有主键约束或者unique约束的属性
  • 当定义外键后,外键列数据必须在主表中存在或者为null

 接下来我们就来创建一个班级表和学生表,学生表的class_id依附于班级表的id。

此时我们的班级表没有数据,然后我们插入的数据没有class_id,那么这个class_id为NULL。 

 即使班级表有数据,但是你选择忽略class_id,那么class_id依旧为NULL。

但是如果你选择不忽略这个class_id,那么插入的数据必须是class表中的数据。

 而你如果想删除主表中的某一个数据,那么前提是从表中没有和它关联的数据。

以上就是外键的作用,它使得两个表之间产生关联,能够更好的管理表中的数据。

总结

本篇博客总结了一些常见的约束,比如非空约束,默认约束,主键外键约束,zerofill约束等,也明白了约束是mysql用来保证数据正确性,防止数据冲突的一种手段。相信本篇博客能够帮助各位对mysql有更深的了解。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值