《MySQL入门很轻松》第5章:数据完整性及其分类

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 数据表中的完整性约束可以理解一种规则或者要求,他规定了在数据表中哪些字段可以输入什么样的值。

1.数据完整性分类

数据库不仅要能存储数据,它也必须能够保证所保存的数据的正确性,为此MySQL 为用户提高了完整性约束条件。数据完整性可分为实体完整性、域完整性和引用完整性,下面进行详细介绍。(1) 实体完整性:指通过表中字段或字段组合将表中各记录的唯一性区别开来。例如,在学生表中,学生之间可能姓名相同,班级编号相同,但是每个学生的学号必然不同。实体完整性的实施方法是添加 PRIMARY KEY 约束和 UNIQUE 约束。(2)域完整性:指表中特定字段的值是有效取值。虽然每个字段都有数据类型,但实际并非满足该数据类型的值即为有效,应合乎情理。例如,学生的出生日期不可能晚于录入数据当天的日期天的日期。域完整性的实施方法是添加 CHECK约束和 DEFAULT 约束。(3)引用完整性:数据库中的表和表之间的字段值是有联系的,甚至表自身的字段值也是有联系的,其中一个表中的某个字段值不但要符合其数据类型,而且必须是引用另一个表中某个字段现有的值。在输入或删除数据记录时,这种引用关系也不能被破坏,这就是引用完整性,它的作用是确保在所有表中具有相同意义的字段值一致,不能引用不存在的值。引用完整性的实施方法是添加PRIMARY KEY 约束。

2. 数据表的约束条件

在数据表中添加约束条件归根到底就是要确保数据的准确性和一致性,即表内的数据不相互矛盾,表之间的数据不相矛盾,关联性不被破坏。为此,可以从以下几个方面检查数据表的完整性约束。(1)对列的控制,包括主键约束(PRIMARY KEY)、唯一性约束(UNIQUE) ;(2)对列数据的控制,包括检查约束(CHECK)、默认值约束(DEFAULT)、非空约束(NOT NULL);(3)对表之间及列之间关系的控制,包括外键约束(FOREIGN KEY)。满足完整性约束要求的数据必须具有以下3个特点。(1)数据值正确无误:首先数据类型必须正确,其次数据的值必须处于正确的范围内。例如,“成绩”表中“成绩”字段的值必须大于或等于0小于或等于100。(2)数据的存储必须确保同一表格数据之间的和谐关系。例如,“成绩”表中的“学号”字段列中的每一个学号对应一个学生,不可能将其学号对应多个学生。(3)数据的存储必须确保维护不同表之间的和谐关系。例如,在“成绩”表中的“课程编号”列对应“课程”表中的“课程编号”列;在“课程”表中的“教师编号”列对应“教师”表中的“教师编号”列。

3. 主键约束

主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段和多字段联合主键。

3.1 创建表时添加主键

如果主键包含一个字段,则所有记录的该字段值不能相同或为空值;如果主键包含多个字段,则所有记录的该字段值的组合不能相同,而单个字段值可以相同,一个表中只能有一个主键,也就是说只能有一个 PRIMARY KEY 约束。注意:数据类型为IMAGE和 TEXT的字段列不能定义为主键。创建表时创建主键的方法是在数据列的后面直接添加关键字PRIMARY KEY,语法格式如下:

字段名 数据类型 PRIMARYKEY

主要参数介绍如下。字段名:表示要添加主键约束的字段。

数据类型:表示字段的数据类型。

PRIMARY KEY:麦示所添加约束的类型为主键约束。

假如,要在酒店客户管理系统的数据库company中创建一个数据表用于保存房间信息,并给房间编号添加主键约束,表的字段名和数据类型如下表所示。

编 号 字段名 数据类型 说明
1 Roomid INT 房间编号
2 Roomtype VARCHAR(20) 房间类型
3 Roomprice FLOAT 房间价格
4 Roomfloor INT 所在楼层
5 Roomface VARCHAR(10) 房间朝向

在数据库中定义Roominfo,为Roomid创建主键约束

createtable Roominfo           --创建Roominfo数据表

(

   Roomid       intprimarykey,           --定义房间编号

   Roomtype     varchar(20),   --定义房间类型

   Roomprice    float,         --定义房间价格

   Roomfloor    int,           --定义房间所在楼层

   Roomface     varchar(20)    --定义房间朝向

);

网络异常,图片无法展示
|

网络异常,图片无法展示
|

在hotel数据库中定义数据表Roominfo_01,为Roommid创建主键约束

SQL语句如下:

create table Roominfo_01  --创建Roominfo_01数据表

(

   Roomid      int,           --定义房间编号

   Roomtype    varchar(20),    --定义房间类型

   Roomprice   float,          --定义房间价格

   Roomfloor   int,            定义房间所在楼层

   Roomface    varchar(20)     --定义房间朝向

   primary key(Roomid)         --定义房间编号为主键约束

);

image-20220216235256510

网络异常,图片无法展示
|

3.2 修改表时添加主键

数据表创建完成后,如果还需要为数据表创建主键约束,此时不需要再重新创建数据表。可以使用 Alter语句为现有表添加主键。使用 ALTER 语句在现有数据表中创建主键,语法格式如下:

ALTERTABLE table name

ADDCONSTRAINT 约束名 PRIMARYKEY (column_namel,column_name2,)

主要参数介绍如下。

CONSTRAINT:创建约束的关键字。

约束名:设置主键约束的名称。

PRIMARY KEY:表示所添加约束的类型为主键约束。

  • 举例说明

在Hotel数据库中定义数据表Roominfo_02,创建完成之后,在该表中的Roomid字段上创建主键约束。输入以下 SQL 语句:

CREATE TABLE Roominfo_02  --创建Roominfo_02数据表

(

--定义房间编号

Roomid int NOT NULL, --定义房间类型

Roomtype varchar(20), --定义房间价格

Roomprice float, --定义所在楼层

Roomfloor int, --定义所在楼层

Roomface varchar(10) --定义房间朝向

);

网络异常,图片无法展示
|

下面给Roomid字段添加主键,输入SOL语句:

ALTERTABLE Roominfo_02ADD

CONSTRAINT  编号

PRIMARYKEY(Roomid);

单击“执行”按钮,即可完成创建主键的操作,如图所示。执行完成之后使用“DESC Roominfo_02;”语句查看表结构,执行结果如图所示。从结果可以看出 Roomid字段上设置了主键约束。

网络异常,图片无法展示
|

网络异常,图片无法展示
|

3.3 创建联合主键约束

在数据表中,可以定义多个字段为联合主键约束,如果对多字段定义了PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARYKEY 约束定义中所有列的任何值组合必须唯一。语法格式如下:

PRIMARYKEY[字段1,字段2,…,字段n]

主要参数介绍如下:

PRIMARY KEY:表示所添加约束的类型为主键约束。

字段n:表示要添加主键的多个字段。

举例说明

在 Hotel 数据库中,定义客户信息数据表userinfo,假设表中没有主键id,为了唯一确定一个客户信息,可以把name、tel联合起来作为主键。输入的SQL语句如下:

CREATE TABLE userinfo --创建userinfo数据表

(

name varchar(20), --定义客户名称

sex tinyint, --定义客户性别

age int, --定义客户年龄

tel varchar (10), --定义客户联系方式

Roomid int, --定义客户入住房间

CONSTRAINT 姓名联系方式

PRIMARY KEY (name , tel)

);

网络异常,图片无法展示
|

单击“执行”按钮,即可完成数据表的创建以及联合主键约束的添加操作,如图所示。执行完成之后,使用“DESC userinfo;,”语句查看表结构,执行结果如图5-10所示,从结果可以看出name字段和 tel字段组合在一起成为userinfo的多字段联合主键

网络异常,图片无法展示
|

3.4 删除表中的主键

当表中不需要指定PRIMARY KEY 约束时,可以使用 DROP语句将其删除。通过 DROP语句删除PRIMARY KEY 约束的语法格式如下:

ALTERTABLEtable_nameDROPPRIMARYKEY;

主要参数介绍如下:

table_name:要删除的主键约束的表名

PRIMARY KEY:主键约束关键字。

举例说明

在company数据库中,删除Roominfo表中定义的王键。SQL 语句:

ALTERTABLE Roominfo

DROPPRIMARY KEY;

网络异常,图片无法展示
|

单击“执行”按钮,即可完成删除主键的操作,如图所示。执行完成之后,使用“DESC Roominfo;”语句查看表结构,执行结果如图所示,从结果可以看出该数据表中的主键已经被删除。

网络异常,图片无法展示
|


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
395 0
|
22天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
84 6
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
160 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
1月前
|
SQL 关系型数据库 MySQL
mysql分页读取数据重复问题
在服务端开发中,与MySQL数据库进行数据交互时,常因数据量大、网络延迟等因素需分页读取数据。文章介绍了使用`limit`和`offset`参数实现分页的方法,并针对分页过程中可能出现的数据重复问题进行了详细分析,提出了利用时间戳或确保排序规则绝对性等解决方案。
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
74 14
|
2月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
68 9
|
3月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
241 6
|
2月前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
60 1
|
2月前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
432 2