【MySQL】第五节—一文详解 | 表的约束(上)

w(゚Д゚)w,我是云边有个稻草人

《MySQL》本篇文章所属专栏---持续更新中w(゚Д゚)w

目录

1、非空约束

[2、default 约束](#2、default 约束)

[【not null 和 default 】](#【not null 和 default 】)

[3、列描述 comment](#3、列描述 comment)

4、zerofill

[5、主键---primary key](#5、主键—primary key)


正文开始------

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

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

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

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

1、非空约束

简而言之,如果有 not null 约束,那就不允许插入 null

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

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

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

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是"约束"。


2、default 约束

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

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

【not null 和 default 】

如果没有设置default,default默认是NULL。

注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空


3、列描述 comment

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


4、zerofill

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

可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?

其实没有zerofill这个属性,括号内的数字是毫无意义的,一会你就明白了。

下面我们通过实际案例来了解一下 zerofill 的作用,见下:

这次可以看到b的值由原来的2变成0000000002,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是2。(细节一)

为什么是这样呢?我们可以用hex函数来证明。

将int(10)修改成int(4)试验一下,见下:

细节二:为什么默认显示宽度是 10?

INT 默认显示宽度为 10,是 MySQL 基于 INT 有符号类型的最大显示位数设计的,同时也可结合无符号 INT 理解这一默认值的合理性:

  1. 有符号 INT 的最大数字位数 :有符号 INT 的最大值是 2147483647,共 10 位数字 (2+9 位,总计 10 位);最小值是 -2147483648,共 11 位(包含负号)。MySQL 选择 10 作为默认值,是取无符号位时的最大位数(也是最常用的 "有效数字位数"),作为通用的默认显示宽度。
  2. 无符号 INT 的补充案例 :无符号 INTUNSIGNED INT)的取值范围是 04294967295,其最大值 429496729510 位数字 (4+9 位)。也就是说:无论是有符号 INT 的最大值(10 位),还是无符号 INT 的最大值(10 位),核心显示位数均为 10 位。这进一步解释了 MySQL 将 10 作为 INT 显示宽度默认值的原因 ------ 它能同时覆盖有符号 / 无符号 INT 最大值的显示位数需求。
  3. 设计初衷 :显示宽度的设计目的是为了格式化输出 (比如用 ZEROFILL 补零:INT(5) ZEROFILL 存储 123 会显示 00123),而 10 是能覆盖有符号 / 无符号 INT 最大值显示位数的 "通用默认值"。

5、主键---primary key

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

主键约束:主键对应的字段中不能重复,一旦重复,操作失败。

案例:创建表的时候直接在字段上指定主键,见下:

删除已经存在的主键:

sql 复制代码
alter table 表名 drop primary key;

随后再往表里面插入数据,就可以成功插入:

当表创建好以后但是没有主键的时候,可以再次追加主键,How?

sql 复制代码
alter table 表名 add primary key(字段列表)

复合主键

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

完------


至此结束------

我是云边有个稻草人

期待与你的下一次相遇!

相关推荐
马克学长3 小时前
SSM校外实习管理平台6tu82(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·计算机毕设·ssm框架·实习管理信息化·校企协同实习
山峰哥3 小时前
数据库性能优化实战:从工程架构到SQL调优的深度解析
大数据·数据库·oracle·性能优化·架构·深度优先
苹果醋33 小时前
java设计模式之责任链模式
java·运维·spring boot·mysql·nginx
soft20015253 小时前
MySQL Buffer Pool性能优化:LRU链表极致设计之道
数据库·mysql·链表
爱技术的阿呆3 小时前
MySQL表约束与表关系
mysql
我可以将你更新哟3 小时前
【scrapy框架】爬取内容后写入数据库
数据库·windows·scrapy
骄傲的心别枯萎3 小时前
RV1126 NO.58:ROCKX+RV1126人脸识别推流项目之读取人脸数据库并保存到map
linux·数据库·计算机视觉·音视频·rv1126
枫叶丹43 小时前
【Qt开发】Qt事件(一)
c语言·开发语言·数据库·c++·qt·microsoft
AIOps打工人3 小时前
Grafana Query MCP:基于FastAPI的Grafana查询转换与分页服务
运维·数据库·python·ai·grafana·fastapi·devops