自学内容网 自学内容网

Linux下学 〖MySQL 〗表的属性之约束条件(上)(NULL/NOT NULL, DEFFUAL, COMMET, ZEROFILL,PRIMAY KEY)

绪论​
在这里插入图片描述
每日激励:“如果痛恨所处的黑暗,请你成为你想要的光。 —— 顾城”

绪论​:
本章继续学习MySQL的知识,本章主要讲到mysql的约束,约束在表中是非常重要的,它保证了表数据的正确性和合法性,本篇将讲到一些比较简单的约束,下篇后续更加重要,将快速更新,敬请期待!
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


表的约束:

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性

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

表中一定要有各种约束,通过约束让我们未来插入数据库中的数据符合预期。约束本质是通过技术手段,倒逼程序员插入正确的数据。反过来站在mysql视角,凡是插进来的数据,都是符合数据约束的。

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

1. 空属性(NULL)

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

例如:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:

  • 如果班级没有名字,你不知道你在哪个班级
  • 如果教室名字可以为空,就不知道在哪上课

所以就班级和教书就一定不能为空,所以就要设置不为空的约束:

 create table myclass(
-> class_name varchar(20) not null,
-> class_room varchar(10) not null
-> other varchar(20);

查看表结构:desc myclass;
请添加图片描述
此时就是对班级和教室进行非空约束,也就是这两个属性不能为空:

具体如下图:请添加图片描述


2. 默认值default

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

举例说明:

 create table t13(
-> name varchar(20) not null,
-> age tinyint unsigned default 0,
-> gender char(2) default '男'
-> );

表结构:
请添加图片描述

  • 当有对该属性设置默认值后,当你插入数据时不写该属性的值时就会自动的给你填写为默认的值(如上图默认给年龄:18、性别:男)那么:
    请添加图片描述
  • 当把一个属性设置为非空,同样还能 同时的 设置默认值约束。
    具体如下图(设置了gender为非空并且默认为男):
    请添加图片描述
  1. 如果我们没有明确指定一列要插入,用的是default请添加图片描述
  2. 如果建表中,对应列默认没有设置default值,无法直接插入

证明如下图(default 和 NOT NULL 不冲突,而是相互补充的)

  1. 因为设定了非空,他就不能插入NULL。
  2. 但忽略不写,且有默认值,它就会直接使用默认值。
  3. 而如果没有默认值,就会报错。

具体如下图:

请添加图片描述

细节:

  • 默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值,而假如也没设置默认值时,系统会自动优化带上默认值为NULL(default null)
  • 所以说:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空

3. 列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,是用来给程序员或DBA来进行了解。
使用比较简单就直接上实操图了:

具体如:
请添加图片描述
当直接看不到,需要使用sql中的:show来查看结构(desc也看不到)请添加图片描述


4. zerofill

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

具体如下图(int 类型 在查看结构时 发现 变成了int(10))

请添加图片描述
向a、b中插入值(发现没啥问题):请添加图片描述
当把b的类型加上zerofill
请添加图片描述
就能发现2变了。

也就是说zerofill约束的作用:如果宽度小于设定的宽度(这里设置的是10),当不足10位时,就会自动填充0。
要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。
具体如下图:
在这里插入图片描述

  • 而unsigned int为啥默认时10位呢:因为:一个无符号的整形最大的值也就是42亿多,用10位就能存下所有整形了,而其中如果时 有符号的整形,他会变成11,这是因为前面的符号位请添加图片描述

  • zerofill一般可用于编号的地方


5. 主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个(但不意味着一个主键只能在一列上,有复合主键,也就是把多个属性合并看成一个属性进行主键约束)
主键:主键通常所在的列通常是整数类型
如下设计:

create table test_key(
-> id int unsigned primary key comment '这个是学生的学号',
-> name varchar(20) not null);
  1. 若该属性为主键在key列下会设置为PRI、并且会自动设为非空约束
    请添加图片描述
  2. 主键的值还不能重复请添加图片描述
  3. 这样有了主键后,就能通过主键快速的找到唯一的一列值
  4. 添加主键的方式:
    1. 在构建表时直接设置为primary key
    2. 在构建完表后,再设置主键
    3. alter table test_key add primary key(指定属性)
    4. 但注意的是,你选择的属性他要修改为主键,那么他就必须提前满足主键的要求,否则就无法修改为主键

如下图他重复出现了2,因此就不满足从而报错。

请添加图片描述
修改方法(也就是删除重复的主键值):
请添加图片描述

  • 复合主键:

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

使用方法如下:
在构建表后写成 primary key(属性1,属性2)
请添加图片描述
理解:其中主键的属性是在这两个属性合并上影响的,也就是说他们单独的并是主键,而是合并起来看的:
具体如下:
请添加图片描述
上图若再次插入复合主键上重复的值就会报错(也就是 ( 1234 , 40 )这俩个属性合起来才称为一个主键!)


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量MySQL细致内容,早关注不迷路。


原文地址:https://blog.csdn.net/ZYK069/article/details/144171318

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!