【MySQL】数据库的约束

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库的约束是关系型数据库的一个重要的功能,因此约束可以规定表中的数据规则,从而确保数据的正确性。

1. 前言


数据库的约束是关系型数据库的一个重要的功能,因此约束可以规定表中的数据规则,从而确保数据的正确性.


2. 非空约束(NOT NULL)


非空约束(NOT NULL): 指示某列不能存储 NULL 值.

如果可以为null,就可以理解选填项,不允许为null,就是必填项.

如果不加约束,创建一张表.它的值是可以为null的.

例如:

111.png

使用desc查看student这张表,可以看到有一列是null,它的值是YES,这就代表它的值可以为null.

112.png

可以新增值为null的数据.

如果id必须填,但是名字可以不填,就需要在创建数据库表时使用非空约束

113.png

使用not null 之后,我们可以看到这里id的null列的值为NO,代表了此处的值不允许为null

此时如果再去新增一个id值为null的数据的话,就会报错.但是

114.png


3. 唯一约束(UNIQUE)


唯一约束(UNIQUE): 保证某列的每行必须有唯一的值

例如学生表中的学生id不能重复,就可以使用UNIQUE来进行约束

115.png

使用desc查看表的结构,可以看到Key这一列,id有一个UNI,就是UNIQUE的前三个字母.

116.png

此时如果新增两个id一样的数据就会报错,使用唯一约束新增数据时,会先去查询数据,没有重复的数据才会进行新增


4. 主键约束(PRIMARY KEY)


主键约束PRIMARY KEY: NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

约束是可以组合使用的,如果一个学生的id即不能为null,也不能重复,就可以使用非空约束加上唯一约束

117.png

但是使用desc 查看表结构时,我们可以看到这里的Key并不是UNI,而是PRI(PRIMARY KEY).

主键约束其实就是非空约束和唯一约束的结合

118.png

使用非空约束加上唯一约束其实和直接设置主键约束是一样的

使用主键约束和唯一约束时,都会先去查询数据,因此MySQL会自动去给主键约束和唯一约束添加索引,从而提高查询的效率

在MySQL中,主键只能有一个!

119.png

虽然MySQL中只能有一个主键,但是MySQL允许把多个列合并在一起,使用同一个主键,这种成为联合主键

主键还有一个常用的用法,使用MySQL自带的"自增主键"作为主键的值,需要在primary key的后面添加auto_increment

120.png

121.png

此时使用desc 查看表结构时,可以看到id在Extra处的值时auto_increment

使用自增主键之后,在插入id的时候,可以指定id,也可以不指定(null),不指定时MySQL就会自动生成

122.png

此处的id 就是由MySQL自动生成的

1234.png

再次插入一条数据时,第二个id是2. 因此MySQL会在上一条数据的id基础上+1.

刚才说了使用自增主键时可以指定,也可以不指定,下面就是指定的效果

125.png

那么此时要在新增一条数据,但是不指定id,新增的id是什么呢?

实践出真知

126.png

可以看到新增的这条数据的id是11.

MySQL的自增主键,会根据最大值进行新增.


5. 默认值约束(DEFAULT)


默认值约束(DEFAULT): 规定没有给列赋值时的默认值

新增数据时,可以指定列新增数据,那么没有被赋值的数据,就会以默认值的进行填充

127.png

上面是我创建的一个"student"表,设置name的默认值为"未命名".

接下来新增两条数据

128.png

第一次新增的数据是一条完整的数据,但是第二条数据,只对id进行了赋值

1289.png

通过查询我们可以看到第二条的数据的name变成了 未命名,给未赋值的列指定默认值.这就是默认值约束的用法


6. 外键约束(FOREIGN KEY)


外键约束(FOREIGN KEY): 保证一个表中的数据匹配另一个表中的值的参照完整性

外键约束是两个表之间相互约束,可以将两张表关联起来.

举个例子: 我要创建两张表,一个是学生信息表,学生信息表中有 学号,学生姓名和学生班级编号 这三个信息.另外一个是班级信息表,班级信息表中有 班级编号,班级的名字这两个信息.

而此时要将学生信息表中的班级编号和班级信息表中的班级编号连接起来,就可以使用外键约束.

创建班级信息表:

130.png

创建学生信息表,同时将 学生信息表中的classId 与 班级信息表中的 id建立连接.

131.png

注意: 设置外键时,外键所参照的键必须为被参照表的主键(primary key)或者是唯一(unique).

建立约束之后,班级信息表中的 班级编号就对学生信息表中的数据产生了约束. 学生的班级编号必须在班级信息表的班级编号中.因此外键约束下,插入数据也会有查询操作.

约束表(此处是班级信息表) 也被称为 “父表”

被约束表(此处是学生信息表) 也被称为 “子表”

虽然父表会对子表产生约束,但是子表也会对父表产生影响.

如果直接删除父表,就会报错.

例如:

132.png

此处并没有删除成功,如果要删除,要先删除子表.

删除或者修改父表中的数据,也要看这条数据是否被子表所引用.

补充: 有时需要把父表删除,但是直接删又删不掉,所以这里可以采用"逻辑删除",可以设置一个变量,让它的取值为0/1,0就是无效数据(逻辑上删除),1是有效数据.只需要改变这个变量的值即可


7.检查约束(CHECK)


检查约束(CHECK) : 保证列中的值符合指定的条件,对于MySQL数据库,对CHECK进行分析,但是忽略CHECK的子句

举个例子: 性别这里一般都是男和女这两个选项,就可以使用检查约束对性别进行约束.在新增数据时,就会对当前新增的数据进行判断,看当前数据是否满足条件.

不过检查约束在MySQL5中并不支持,写了不会报错,但也不会执行.所以不做过多介绍了.


8. 总结


约束在数据库中还是很重要的,再说一下主键常用的方法在主键可以使用MySQL自带的"自增主键"作为主键的值,需要在primary key的后面添加auto_increment,外键要搞清楚那个是父表,那个是子表.设置外键时,外键所参照的键必须为被参照表的主键(primary key)或者是唯一(unique).

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
24 1
|
11天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
26 4
|
18天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
85 1
|
5天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
43 0
|
18天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
128 6
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引
|
1月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
70 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
20天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
61 2
|
23天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
89 4