【MySQL】数据库的约束

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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).

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
13 0
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
20 0
|
2天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
16 0
|
4天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
26 0
|
4天前
|
SQL 关系型数据库 Serverless
阿里云关系型数据库RDS
阿里云关系型数据库RDS
16 2
|
4天前
|
关系型数据库 MySQL 数据库
mysql 设置环境变量与未设置环境变量连接数据库的区别
设置与未设置MySQL环境变量在连接数据库时主要区别在于命令输入方式和系统便捷性。设置环境变量后,可直接使用`mysql -u 用户名 -p`命令连接,而无需指定完整路径,提升便利性和灵活性。未设置时,需输入完整路径如`C:\Program Files\MySQL\...`,操作繁琐且易错。为提高效率和减少错误,推荐安装后设置环境变量。[查看视频讲解](https://www.bilibili.com/video/BV1vH4y137HC/)。
24 3
mysql 设置环境变量与未设置环境变量连接数据库的区别
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
139 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
104 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
|
存储 SQL 关系型数据库
MySQL---数据库从入门走向大神系列(五)-存储过程
MySQL---数据库从入门走向大神系列(五)-存储过程
113 0
MySQL---数据库从入门走向大神系列(五)-存储过程
|
数据库
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
168 0
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)