Day03 01-MySQL数据完整性详解
文章目录
- 第七章 数据完整性
- 7.1 完整性约束
- 7.2 实体完整性
- 7.2.1 唯一约束
- 7.2.2 主键约束
- 7.2.3 自增约束
- 7.3 域完整性
- 7.3.1 非空约束
- 7.3.2 默认值约束
- 7.3.3 检查约束
- 7.4 引用完整性
第七章 数据完整性
7.1 完整性约束
我们已经知道了如何创建数据库、如何创建表、如何在表中进行数据的插入操作。但是在实际工作中,我们需要考虑插入到表中的数据是否是合乎逻辑的。因此,有时候我们需要在插入数据的时候,对数据进行校验,以保证插入表中的数据没有逻辑的错误。这就是数据的完整性。而为了保证数据的完整性,我们往往需要借助一些约束来实现。
MySQL数据完整性非常重要,它能保障MySQL库-表中的数据质量,会影响后续大数据的数据仓库等项目的实施,所以大家一定要看得懂(重视)。
数据的完整性约束可以分为三类: 实体完整性、域完整性和引用完整性。
7.2 实体完整性
我们将表中的一行数据,称为一个“实体”,而所谓的实体完整性约束,就是保证这一行数据的唯一的,不会出现重复的行数据。
为了达到这样的目的,实体完整性约束有三种: 唯一约束、主键约束、自增约束。
7.2.1 唯一约束
关键字: unique
作用: 顾名思义,就是修饰某一个字段,这个字段的值在一张表内不能重复!
-
单个键的唯一约束
-
建表的同时添加
-- 创建表 create table `student` (`id` int unique, -- 修饰为unique,表示id字段的值不允许出现重复的情况`sname` varchar(50) ); -- 或者 create table `student` (`id` int,`sname` varchar(50),unique(`id`) );-- 表创建完成后,在进行数据插入的时候,如果插入了重复的id,则第二次插入数据的时候会有错误提示,无法插入数据,保证这一行数据的唯一 insert into student values (1, 'zhangsan'); insert into student values (2, 'lisi');
-
建表之后追加
-- 创建表 create table student (id int,sname varchar(50) );-- 追加id为唯一约束 alter table student add unique (`id`);
-
-
联合唯一约束
-
描述
所谓的“联合唯一约束”,指的是可以将多个字段绑定在一起进行非空的约束。只有当这些字段的值都相同的情况下,才会视为重复的数据,不允许继续插入。
-
建表的时候添加
create table `student` (`id` int,`sname` varchar(50),unique(`id`, `sname`) );
-
建表之后追加
-- 创建表 create table student (id int,sname varchar(50) );-- 追加id为唯一约束 alter table student add unique (`id`, `sname`);
-
测试
insert into `student` values (1, 'a'); -- 第一次插入数据,表中没有重复的行,可以添加 insert into `student` values (1, 'b'); -- 虽然表中已经有id为1的行,但是sname并不重复,依然可以添加 insert into `student` values (2, 'b'); -- 同理,表中虽然已经有sname为b的行,但是id并不重复,依然可以添加 insert into `student` values (2, 'b'); -- id和sname的值都与已经存在的某一行数据重复,因此添加失败
-
-
移除约束
alter table `student` drop index `sid`;
7.2.2 主键约束
关键字: primary key
其实,为了保证数据的唯一性,主键才是工作中最常用的约束方式。一般情况下,会将代表这一行数据的唯一标识的字段设置为主键。在进行查询操作的时候,通常情况下也是会使用主键进行行数据的区分。
主键的值不允许出现重复,也不允许出现NULL的情况。
添加主键有几种方式:
-
在建表的时候添加主键,只添加一个主键
create table student (id int primary key,sname varchar(50) )
-
在建表的时候添加主键,同时添加多个主键
create table sc (sid int,cid int,score int,primary key(sid, cid) -- 如果有多个主键需要添加,不能在字段的后面直接写primary key。需要通过这样的方式来添加。 )
-
在建表完成后追加主键
create table course (cid int,cname varchar(50) )alter table course add primary key (cid);
删除表中的主键:
alter table course drop primary key;
7.2.3 自增约束
顾名思义,自增约束表示对某一个字段的值进行自动的增长。只能用在整型数据类型的主键约束上。表示在进行行数据的赋值的时候,如果不设置主键的值,这个值会自动的在之前的值的基础上+1。
-- 建表
create table student(sid int primary key auto_increment,sname varchar(50)
)-- 插入数据
insert into student (sname) values ('zhangsan'); -- 没有设置主键sid的值,则此时的sid自动增长为1
insert into student values (10, 'lisi'); -- 此时已经设置了sid的值,则这行数据的sid就是10
insert into student (sname) values ('wangwu'); -- 没有设置主键sid的值,将会在目前最大的id基础上+1,也就是11
注意事项:
在表内会有一个变量,来记录当前的表最大的主键已经到达多少了。需要进行主键自增的时候,从这个记录了最大的主键的基础上进行自增,而不是简单的从上一行的基础上自增。
insert into student values (100, 'wangwu');
insert into student values (50, 'zhaoliu');
insert into student (sname) values ('tianqi'); -- 当前的表中,记录最大的主键值是100,因此这一行数据主键会自增到101
注意事项:
在删除表中的数据的时候,如果使用delete from进行删除,则无法删除表中记录的最大值。
insert into student values (200, 'xiaoming');
delete from student;
insert into student (sname) values ('xiaohei'); -- 此时的自增,结果依然是201
注意事项:
在删除表的时候,除了可以使用delete from进行删除,也可以使用truncate进行删除的操作。前面也说过这两种操作的区别,其中truncate是将现在的表进行drop,然后再按照之前的表结构(字段的名字、类型等信息),创建出来一张跟这个表结构完全相同的表出来。那么问题来了,delete在删除数据的时候,只是删除数据,并不会对表结构进行修改,也就是说表中记录的最大的主键信息是会保留下来的。但是truncate是drop原来的表,然后创建一张新的表。那么之前的记录的最大主键值的信息也就不存在了。
insert into student values (200, 'xiaoming');
delete from student;
insert into student (sname) values ('xiaohei'); -- 自增的sid,值是201
truncate student;
insert into student (sname) values ('xiaolan'); -- 从头自增的sid,值是1
7.3 域完整性
域完整性约束,指的是对一个单元格内的数据进行约束,对某一个单元格内的数据进行约束。
7.3.1 非空约束
关键字: not null
顾名思义,就是对某一个字段进行修饰,修饰这一个字段的值不能是NULL。
create table student (sid int primary key,sname varchar(30) not null
)-- 建表之后追加
alter table `student` change `sname` `sname` varchar(30) not null;
-- 建表之后移除
alter table `student` change `sname` `sname` varchar(30);-- 正常的数据插入
insert into student values (10, 'Jerry');-- 错误的写法,因为sname已经修饰为not null了
insert into student values (10, NULL);-- 错误的写法,因为非空的字段的值没有设置
insert into student (sid) values (1);
7.3.2 默认值约束
关键字: default
修饰某一个字段,在这个字段进行赋值的时候没有赋值的情况下,这个字段将会拥有一个默认的初始值
create table student (sid int primary key,sname varchar(20) default 'unkonwn'
)-- 正确的使用
insert into student (sid) values (100); -- 没有设置sname的值,此时会采用默认的值
insert into student values (101, default); -- 直接使用关键字default,表示使用默认值
7.3.3 检查约束
检查约束,类似于Java中的枚举,约束这个字段的值只能够在有限的几个值内进行选择。
关键字: check
create table teacher( tid int, tname varchar(20), tgender char(1) check(tgender in('f','m')) -- 约束这个字段的值只能是m或者f
);
insert into temp_5 values (1001,'zs','a');
select * from teacher;
关键字: enum
create table temp_6( tid int, tname varchar(20), tgender enum('f','m') -- 枚举的写法
);
7.4 引用完整性
主要就是外键约束(foreign key)
字段A的值,依赖于字段B的值。这两个字段可以在同一张表中,也可以在不同的表中。字段A所在的表称之为从表(副表),字段B所在的表称之为主表(父表)。字段A的值也可以为null. 字段B必须为主键约束。
依赖的字段B,必须是目标表的主键
-- 1. 在建表的时候添加外键
create table tableName(tid int primary key auto_increment, tname varchar(20), tmgr int,constraint constraintName Foreign key(tmgr) references tableName(tid)
);-- 2. 在建表之后追加
alter table tableName1 add constraint constraintName foreign key(colName1) references tableName2(colName2);-- 3. 撤销外键
ALTER TABLE score DROP FOREIGN KEY score_ibfk_1;
EXT:
在添加主键的时候,可以同时设置删除和更新时的约束:
- RESTRICT: 默认的约束,不允许修改、删除被引用的字段的值
- CASCADE: 级联修改,在修改、删除被引用的字段的时候,引用方的一行数据也随之修改和删除
- SET NULL: 空值处理,在修改、删除被引用的字段的时候,引用方的引用字段的值会设置为NULL
- NO ACTION: 不处理,在修改、删除被引用的字段的时候,引用方的引用字段不作任何改变
语法:
alter table tableName1 add constraint constraintName foreign key(colName1) references tableName2(colName2) on delete restrict on update restrict;
相关文章:
Day03 01-MySQL数据完整性详解
文章目录 第七章 数据完整性7.1 完整性约束7.2 实体完整性7.2.1 唯一约束7.2.2 主键约束7.2.3 自增约束 7.3 域完整性7.3.1 非空约束7.3.2 默认值约束7.3.3 检查约束 7.4 引用完整性 第七章 数据完整性 7.1 完整性约束 我们已经知道了如何创建数据库、如何创建表、如何在表中…...

DJ 5-4 以太网 Ethernet
目录 一、以太网的物理拓扑结构 二、以太网物理层标准 1、以太网技术:10Base-T 和 100Base-T 2、以太网技术:1000Base 系列 3、曼彻斯特编码* 4、差分曼彻斯特编码机制* 三、以太网链路层控制技术 四、以太网的帧结构 1、前同步码 2、MAC 地址…...

华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】
一、题目描述 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn。 随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链…...
Java 实现 二叉树的 后序遍历
1、定义节点类 class Node {int val;Node left;Node right;Node(int val) {this.val val;} }public class BinaryTree {/*** 后序遍历* param root 节点*/public void postorderTraversal(Node root) {if (root ! null) {postorderTraversal(root.left);postorderTraversal(r…...
rk3588安装qt虚拟键盘
qt是默认安装的,版本号为5.12.8,但是没有虚拟键盘模块,项目中需要,就采用源码编译的方法执行 下载源码 源码地址为Index of /archive/qt/5.12/5.12.1/submodules,下载后放到3588中解压cd到src路径,运行一下命令 …...

HCIP-RIP双向重发布综合实验
拓扑结构: 要求: 1、两个协议间进行多点双向重发布 2、R7的环回没有宣告在OSPF协议中,而是在后期重发布进入的 3、解决环路,所有路径选择最优,且存在备份 4、R2的环回要在RIP中宣告,R3的环回要在OSPF中宣…...
Flask的使用例子
以下是一个简单的使用Flask创建Web应用程序的示例: from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def home():return Hello, World!app.route(/about) def about():return render_template(about.html)app.route(/submit, …...

【基础6】存储过程的 创建与调用
目录 什么是存储过程 用户自定义存储过程 练习 什么是存储过程 什么是存储过程 类似于C语言中的函数。用来执行管理任务或应用复杂的业务规则存储过程可以带参数,也可以返回结果存储过程可以包含数据操纵等语句、变量、逻辑控制语句等。(单个select语…...

如何快速实现接口自动化测试,常规接口断言封装实践
目录 前言: 一、框架设计思路 1. 封装请求方法 2. 断言封装 3. 接口封装 4. 接口统一管理 二、框架使用 三、总结 前言: 在当今互联网行业中,接口自动化测试已经成为了非常重要的测试手段之一。而在这个过程中,接口自动化…...

java+nodejs+vue+python+php家教信息管理系统
任何网友都可以自由地查看、搜索、发布该家教信息平台的信息。该平台是区别于传统的家教中介的服务平台。学生可以免费查看网站上的家教信息,挑选适合自己的家教;教师可以免费查看网站上的需求信息,挑选适合自己的学生;学生可以发…...

课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)
课程名称: 鸿蒙HarmonyOS系统及物联网开发实战课程 课程介绍: HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS 提出了基于同一套系统能力、适配多种终端形态的分布式理念,…...

【数据结构】线性表之栈、队列
前言 前面两篇文章讲述了关于线性表中的顺序表与链表,这篇文章继续讲述线性表中的栈和队列。 这里讲述的两种线性表与前面的线性表不同,只允许在一端入数据,一段出数据,详细内容请看下面的文章。 顺序表与链表两篇文章的链接&…...
StringUtils.substring\[XX]()字符串截取方法总结
StringUtils.substring[XX]()字符串截取方法总结 StringUtils (Apache Commons Lang 3.12.0 API) 文章目录 StringUtils.substring\[XX]()字符串截取方法总结导入依赖方法介绍substring(String str, int start)substring(String str, int start, int end)substringAfter(String…...

SeaweedFs使用-通过http接口实现文件操作
通过http接口实现文件操作 SeaweedFs可通过filer的http接口/master中的http接口来进行文件上传 1.通过master的接口进行上传文件 通过各种方式进行请求接口:http://localhost:9333/submit, ip和端口号是master服务的信息。此接口通过post请求方式将文件的二进制流…...

成绩管理系统
系列文章 任务28 成绩管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试读入数据浏览全部信息增加学生信息保存数据删除学生信息修改学生…...

【MYSQL】事务的4大属性,对隔离级别的详细讲解
目录 1.原子性和持久性 1.1.手动提交事务 1.2.自动提交事务 1.3.事务的原理: 2.隔离性 1.读未提交(Read Uncommitted) 2.读提交(Read Committed) 3.可重复读 4.串行化 3.一致性 4.理解读提交和可重复读的实现…...

如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?
在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前: 手工输入命令安装各类软件,操作起来费时费力并且容易出错,而且需要记住很多Linux的命令,非常复杂。 使用宝塔后: 2分钟装好面板,一键…...
HTTP(九)-- response对象 -- 向页面响应数据
目录 1. 服务器输出字符数据到浏览器 1.1 获取字符输出流 1.2 实例演示:...

音视频windows安装ffmpeg6.0并使用vs调试源码笔记
建立在上一步,vs已经能够正常调试qt项目,可以实现: 1:qt可以使用mvsc (使用cdb)进行调试。 2:vs已经可以加载qt项目,借助vs进行调试。 本文目标:编译ffmpeg库…...

Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题
Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题 1.Midjourney Prompt 高级参数 Quality 图片质量是另一个我比较常用的属性,首先需要注意这个参数并不影响分辨率,并不改变分辨率&#x…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...