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为非空并且默认为男):
- 如果我们没有明确指定一列要插入,用的是default
- 如果建表中,对应列默认没有设置default值,无法直接插入。
证明如下图(default 和 NOT NULL 不冲突,而是相互补充的)
- 因为设定了非空,他就不能插入NULL。
- 但忽略不写,且有默认值,它就会直接使用默认值。
- 而如果没有默认值,就会报错。
具体如下图:
细节:
- 默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值,而假如也没设置默认值时,系统会自动优化带上默认值为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);
- 若该属性为主键在key列下会设置为PRI、并且会自动设为非空约束
- 主键的值还不能重复
- 这样有了主键后,就能通过主键快速的找到唯一的一列值
- 添加主键的方式:
- 在构建表时直接设置为primary key
- 在构建完表后,再设置主键
- alter table test_key add primary key(指定属性)
- 但注意的是,你选择的属性他要修改为主键,那么他就必须提前满足主键的要求,否则就无法修改为主键
如下图他重复出现了2,因此就不满足从而报错。
修改方法(也就是删除重复的主键值):
- 复合主键:
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
使用方法如下:
在构建表后写成 primary key(属性1,属性2)
理解:其中主键的属性是在这两个属性合并上影响的,也就是说他们单独的并是主键,而是合并起来看的:
具体如下:
上图若再次插入复合主键上重复的值就会报错(也就是 ( 1234 , 40 )这俩个属性合起来才称为一个主键!)
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量MySQL细致内容,早关注不迷路。
原文地址:https://blog.csdn.net/ZYK069/article/details/144171318
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!