【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(主键字段列表)来创建主键,如果有多个字段 作为主键,可以使用复合主键。

完------


至此结束------

我是云边有个稻草人

期待与你的下一次相遇!

相关推荐
qianshang2331 小时前
SQL注入学习总结
网络·数据库·渗透
what丶k1 小时前
深入解析Redis数据持久化:RBD机制原理、实操与生产最佳实践
数据库·redis·缓存
瀚高PG实验室2 小时前
通过数据库日志获取数据库中的慢SQL
数据库·sql·瀚高数据库
Hgfdsaqwr2 小时前
Python在2024年的主要趋势与发展方向
jvm·数据库·python
invicinble2 小时前
对于Mysql深入理解
数据库·mysql
阳光九叶草LXGZXJ3 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
Hgfdsaqwr3 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
s1hiyu3 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python
2301_763472463 小时前
使用Seaborn绘制统计图形:更美更简单
jvm·数据库·python
熊文豪4 小时前
金仓数据库如何以“多模融合“重塑文档数据库新范式
数据库·金仓数据库·电科金仓·mongodb迁移