[MySQL][表的约束][一][空属性][默认值][列描述][zerofill]详细讲解

2024-07-21 1171阅读

目录

  • 0.前言
  • 1.空属性
  • 2.默认值
    • 1.是什么?
    • 2.如果同时设置了NOT NULL和default会怎样?
    • 3.列描述
    • 4.zerofill

      0.前言

      • 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性
        • 比如有一个字段是email,要求是唯一的
        • 表中一定要有各种约束,通过约束,让未来插入数据库表中的数据是符合预期的
          • 约束本质:通过技术手段,倒逼程序员,插入正确的数据
          • 反过来,站在MYSQL视角,凡是插入进来的数据,都是符合数据约束的
          • 约束的最终目的:保证数据的完整性和可预期性
          • 表的约束很多,这里主要介绍如下几个

            1.空属性

            • 两个值:NULL(默认的)和NOT NULL(不为空)
            • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算
              select null;
              +------+
              | NULL |
              +------+
              | NULL |
              +------+
              select 1+null;
              +--------+
              | 1+null |
              +--------+
              |   NULL |
              +--------+
              
            • 示例:创建一个班级表,包含班级名和班级所在的教室
              • 站在正常的业务逻辑中
                • 如果班级没有名字,你不知道你在哪个班级
                • 如果教室名字可以为空,就不知道在哪上课
                • 所以在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是"约束"
                  mysql> create table myclass(
                   -> class_name varchar(20) not null,
                   -> class_room varchar(10) not null);
                  mysql> desc myclass;
                  +------------+-------------+------+-----+---------+-------+
                  | Field      | Type        | Null | Key | Default | Extra |
                  +------------+-------------+------+-----+---------+-------+
                  | class_name | varchar(20) | NO   |     | NULL    |       |
                  | class_room | varchar(10) | NO   |     | NULL    |       |
                  +------------+-------------+------+-----+---------+-------+
                  # 插入数据时,没有给教室数据插入失败:
                  mysql> insert into myclass(class_name) values('class1');
                  ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
                  

                  2.默认值

                  1.是什么?

                  • 默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值
                  • default:如果设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的
                    mysql> create table t1 (
                    -> name varchar(20) not null,
                    -> age tinyint unsigned default 0,
                    -> sex char(2) default '男'
                    -> );
                    mysql> desc t1;
                    +-------+---------------------+------+-----+---------+-------+
                    | Field | Type                | Null | Key | Default | Extra |
                    +-------+---------------------+------+-----+---------+-------+
                    | name  | varchar(20)         | NO   |     |    NULL |       |
                    | age   | tinyint(3) unsigned | YES  |     |       0 |       |
                    | sex   | char(2)             | YES  |     |      男 |       |
                    +-------+---------------------+------+-----+---------+-------+
                    mysql> insert into t1(name) values('zhangsan');
                    mysql> select * from tt10;
                    +----------+------+------+
                    | name     | age  | sex  |
                    +----------+------+------+
                    | zhangsan | 0    | 男   |
                    +----------+------+------+
                    --注意:只有设置了default的列,才可以在插入值的时候,对列进行省略
                    

                    2.如果同时设置了NOT NULL和default会怎样?

                    • default和NOT NULL并不冲突,而是互相补充的
                      • 如果没有明确指定一列要插入,用的是default
                      • 如果建表中,对应列默认没有设置default值,无法直接插入
                      • 两个关键字约束的东西是不同的
                        • NOT NULL:当用户想插入的时候
                          • 是否为NULL
                          • 合法数据
                          • default:
                            • 当用户忽略这一列的时候,使用默认值(如果设置了)
                            • 如果没有设置,直接报错
                            • 注意:NOT NULL和defalut一般不需要同时出现,因为default本身有默认值,不会为空

                              3.列描述

                              • 列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解
                                mysql> create table t2 (
                                -> name varchar(20) not null comment '姓名',
                                -> age tinyint unsigned default 0 comment '年龄',
                                -> sex char(2) default '男' comment '性别'
                                -> );
                                
                              • 通过desc查看不到注释信息:
                                mysql> desc t2;
                                +-------+---------------------+------+-----+---------+-------+
                                | Field | Type                | Null | Key | Default | Extra |
                                +-------+---------------------+------+-----+---------+-------+
                                | name  | varchar(20)         | NO   |     | NULL    |       |
                                | age   | tinyint(3) unsigned | YES  |     | 0       |       |
                                | sex   | char(2)             | YES  |     | 男      |       |
                                +-------+---------------------+------+-----+---------+-------+
                                
                              • 通过show可以看到:
                                mysql> show create table t2\G
                                *************************** 1. row ***************************
                                Table: t2
                                Create Table: CREATE TABLE `t2` (
                                `name` varchar(20) NOT NULL COMMENT '姓名',
                                `age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',
                                `sex` char(2) DEFAULT '男' COMMENT '性别'
                                ) ENGINE=MyISAM DEFAULT CHARSET=gbk
                                

                                4.zerofill

                                • 刚开始学习数据库时,可能对数字类型后面的长度很迷茫
                                • 通过show看看t3表的建表语句:
                                  mysql> show create table t3\G
                                  ***************** 1. row *****************
                                  Table: t3
                                  Create Table: CREATE TABLE `t3` (
                                  `a` int(10) unsigned DEFAULT NULL,
                                  `b` int(10) unsigned DEFAULT NULL
                                  ) ENGINE=MyISAM DEFAULT CHARSET=gbk
                                  
                                • 可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?
                                  • 其实没有zerofill这个属性,括号内的数字是毫无意义的
                                  • a和b列就是前面插入的数据,如下:
                                    mysql> insert into t3 values(1,2);
                                    mysql> select * from tt3;
                                    +------+------+
                                    | a    | b    |
                                    +------+------+
                                    | 1    | 2    |
                                    +------+------+
                                    
                                  • 但是对列添加了zerofill属性后,显示的结果就有所不同了。修改tt3表的属性:
                                    mysql> alter table t3 change a a int(5) unsigned zerofill;
                                    # 也可用 alter table t3 modify a int(5) unsigned zerofill;
                                    mysql> show create table t3\G
                                    *************************** 1. row ***************************
                                    Table: tt3
                                    Create Table: CREATE TABLE `tt3` (
                                    `a` int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill
                                    `b` int(10) unsigned DEFAULT NULL
                                    ) ENGINE=MyISAM DEFAULT CHARSET=gbk
                                    
                                  • 对a列添加了zerofill属性,再进行查找,返回如下结果:
                                    mysql> select * from t3;
                                    +-------+------+
                                    | a     | b    |
                                    +-------+------+
                                    | 00001 | 2    |
                                    +-------+------+
                                    
                                  • 这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0
                                    • 要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1
                                    • 可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已
                                    [MySQL][表的约束][一][空属性][默认值][列描述][zerofill]详细讲解
                                    (图片来源网络,侵删)
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]