• MySQL数据库 -- 表的约束


       

            关于数据库约束的话题,今天来进一步讲解,之前说过,数据类型本身就是一种约束。数据库是和数据打交道的,所以要对数据的管理有非常完整的约束体系。今天我们来谈一谈表结构的约束,下一篇再来讲表的增删查改的操作~

    表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,
    auto_increment,unique key 

    目录

    空属性

    默认值

    not null 和default同时出现时

    列描述

    zerofill 

    主键

    表中删除主键 

     表中添加主键

    复合主键

    自增长

    注意

    唯一键

    当唯一键设置not null时 

    主键和唯一键的区别

    我们来举一个比较贴合实际的栗子

    外键

    外键 vs外键约束


    空属性

    两个值:null(默认的)和not null(不为空)
    数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

    注意:这里的null和语言级别的null表示的含义不一样,数据库层面的null表示没有值的意思,千万不要混淆。

    默认值

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

    举个栗子:

    对比一下不加default: 

    我们发现我们这时候不给值就变成了NULL,表示没有值的意思。 

    not null 和default同时出现时

    我们发现,not null和default同时出现时,not null就毫无意义,这时候以default为准。 

    列描述

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

    可以理解为语言级别的注释。

    举个栗子:

    zerofill 

    刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看t17表的建表语句:

    我们给a和b两列插入数据并显示时对比显示结果的特点:

     

    我们发现int(5)后面的参数5意思是:当显示的数字位数不够5位时,并且这个类型被赋予了zerofill字段,我们就在前面补0,直到够5位。 如果超过5位就正常显示即可。

    实际中,这个属性我们并不经常使用。

    主键

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

    举个栗子:

    表中删除主键 

     表中添加主键

    举个栗子:

           删除主键时,drop primary key不用指定哪个列是主键。添加主键时,add primary key(列名)这时候需要指明哪个列被设置为了主键。

    复合主键

    在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

    举个栗子:

            当设置符合主键时,插入的数据中,局部的主键冲突,照样可以插入成功。如果设置的复合主键中,所有数据都冲突,插入失败。

    自增长

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

    自增长的特点:
    1、任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
    2、自增长字段必须是整数
    3、一张表最多只能有一个自增长

    举个栗子:

            我们从上面的演示结果发现,我们设置auto_increment第一次插入插入时默认从1开始。其次,我们当删除最大的当前auto_increment表行内容(3)时,下次默认自增时是从(3+1)历史最大值+1开始计算的。

    注意

            我们使用auto_increment不能仅仅使用这个属性,否则创建表是不成功的。我们必须使用在具有唯一属性的列中,比如primary key或unique(下面讲)。 

    auto_increment字段里面的值是不能重复的。

    唯一键

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

    举个栗子:

    当唯一键设置not null时 

            当该表中没有主键时,如果设置一个唯一键并且设置not null字段,那么这个列属性就变成了主键! 

    主键和唯一键的区别

            实际上主键和唯一键不是用来比较的,主键和唯一键是相辅相成的。主键最好使用不可修改的属性来作为主键,基本与业务无关的属性做主键。 

    像qq、电话号码等不太适合做主键。

    我们来举一个比较贴合实际的栗子

    只使用主键时,没有唯一键:

            我们发现,id设置为主键,qq不能设置为主键了,所以qq有重复的可能性,这在现实生活中显然是不合理,所以我们要保证qq也是具有唯一性的,所以我们要使用唯一键来保证其它字段的唯一性。

    使用主键和唯一键:

    我们把id设置为主键,qq和电话设置为唯一键。

    这时候我们发现插入id、qq、电话时只要有一个重复就插入失败。

    外键

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

    语法:

    foreign key (字段名) references 主表(列)

    如果我们没有外键时,

    举个栗子:

            这时候我们发现创建的从表中李四对应的10号班级在主表中竟然没有对应!这显然是不合理的!这时候需要添加外键约束条件。 

    使用外键约束建立举个栗子:

             所以从上面的演示说明,这时候我们插入时,从表中的id必须在主表中有对应的id才能插入。当我们删除主表某一个字段信息时,只有从表中对应的所有id都被删除后,主表才能删除成功。

    外键 vs外键约束

            外键是用来实现表和表之间关系的字段,其实只是我们自己知道,但是只要是操作,就可能犯错误。为了强约束表之间的关系,需要添加外键约束,添加了外键约束,mysql才会帮你维护表之间的逻辑关系。

    看到这里,给博主点个赞吧~

      

  • 相关阅读:
    ospf的工作过程和特点
    Ubutnu允许ssh连接使用root与密码登录
    总结List三种实现类
    ES核心概念、IK分词器
    基于哈希表对unordered_map和unordered_set的封装
    经典算法学习之-----直接选择排序
    全波形反演培训的思考与总结
    python可视化分析(五)-绘制边缘箱线图
    DAY 69 rsync远程同步
    测试新人,如何快速上手一个陌生的系统!
  • 原文地址:https://blog.csdn.net/qq_58724706/article/details/127808658