数据库之约束、索引和事务

news/2024/4/16 19:43:39/文章来源:https://blog.csdn.net/weixin_73060900/article/details/130336673

一、约束

约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性.

1.not null  -  >  数据元素非空

表示如果插入数据,则当前数据不能为空.

//创建一张学生表,其班级id和年级id不为空
create table student (id int not null ,name varchar(20) ,gender varchar(5) ,class_id int not null) ;

2.unique  -  >    让列的值唯一

表示所约束的此列,值不能重复,必须唯一

//创建一个学生表,其id不为空
create table studnet (id int unique ,name varchar(20));

3.default  -  >  让列具有默认值

表示如果插入一行而指定列未插入时,默认初始化

//建立一个珠宝表,如果价值未告诉,默认其未无价之宝
create table jewelry(name varchar(20) ,price varchar(200) default '无价之宝') ;

4. primary key  -  >  主键

对主键的要求就是唯一并且不能为空

MySQL中对主键的要求就是表里只能有一个主键,并且不能为空

虽然只能有一个主键,但是可以以一列作为主键,也可以以多列作为主键.

//创建一个学生表,其id不能为空,且不能重复
create table student(id int primary key ,name varchar(5)) ;

拓展:自增主键

给自增主键插入数据的时候,可以手动插入一个值,也可以让MySQL自动分配

如果要自动分配,那么插入值时标记为null即可

并且在自动分配时,系统给定值一定比所有值的最大值还要大

//创建一个学生表,其id为自增主键
create table student (id int primary key auto_increment ,name varchar(20)) ;

5.foreign key  -  >  外键

顾名思义:外键应该是两张表进行联合

外键的写法:一个表中非主键的字段指向另一张表主键的字段

当更改父表和子表时,如果约束关系不成立,那么就不能进行更改:

对于父表来说,不能删除和修改

对于子表来说:不能修改或新增

上述都是建立在约束关系不成立的基础上

如果增删查改时约束关系成立,那么就可以进行

//创建一张班级表和学生表//带有主键的班级表
create table class(classid int primary key auto_increment ,className varchar(20)) ;//其中表示此表的classid和班级表的classid构成约束关系
create table student(id int ,name varchar(20) ,classid int, foreign key (classid) references class(classid)) ;

二 、索引

索引就是给数据库增加一个目录

其目的就是增快查询速度,带来的坏处就是占用空间增多

虽然查询速度增快,但是修改,删除,插入的速度就会减慢

但是整体来说,利大于弊.毕竟在工作过程中,查询频率是最高的.

1.查看索引

show index from class ;

2.创建索引

create index index_stduent_name on student(name) ;

3.删除索引

drop index index_student_name on student ;

4.索引背后的数据结构  -  >  B+树(一般都是面试常考)

运用了树的结构

不使用二叉搜索树的原因:如果树的元素变多了,那么树的高度就会变高,树的高度就相当于访问次数,对于数据库来说,数据是存在硬盘当中的,每访问一次硬盘,时间效率是巨大的,因此不采用二叉搜索树

不使用哈希表的原因:虽然哈希查询的快,但是不支持范围查询,不支持模糊匹配,从而不使用哈希表来进行查询

先了解B树,也就是所谓的B-树

B树可以认为是一个N叉搜索树,当节点的子树多了,节点上保存的key多了,意味着在同样key个数的前提下:B树的高度就要比二叉搜索树低很多,树的高度越高,进行查询时访问磁盘的次数就越多

 

B+树是在B树的基础上又做出改进(也是N叉搜索树)

右值就是其最大值,而B树则可能比右值还大(两树的唯一区别)

 

特点:一个节点可以存储N个key , N个key划分出了N个区间

每个节点中Key的值,都会在子节点中出现,并且key是子节点的最大值

B+树的叶子节点是首尾相连,类似于一个链表,因此整个树的所有数据都是包含在叶子节点中的(所有非叶子节点key值最终都会出现在叶子节点中)

由于叶子节点,是完整的数据集合,只在叶子节点这里存数据表的每一行记录,

而非叶子节点,只存key值本身即可

B+树的优势

当一个节点保存更多的key,最终树的高度是相对更矮的,查询的时候减少了IO访问次数(和B树一样)

所有的查询结果最终都会落到叶子节点上(查询任何一个数据,经过的IO访问次数,是一样的)

B+树所有的叶子节点构成链表,此时比较方便进行范围查询

由于数据都在叶子节点上,非叶子节点只能存储key.导致非叶子节点占用的空间是比较小的,这些非叶子节点就可以在内存中缓存(或者缓存一部分),又进一步减少了IO的次数

MySQL组织数据的形式,当你看到一张表的时候

实际上这个表不一定就是按照表格的这样的数据结构在硬盘上组织的

也有可能是按照这种树形结构组织的

具体是那种结构,取决你表里有没有索引,以及数据库使用了哪种存储引擎

如果有多个索引

假设有一个主键索引,还有一个索引

那么,首先还是构建一个主键索引,然后,针对另一个索引,又会创建另外一个B+树

但是这个叶子节点不是存储其索引的值,而是主键索引的值

如果根据索引来查询,查到的是主键索引的值,然后再查询一次主键索引

从而得到结果

上述过程称为回表,都是由MySQL自动完成的,用户察觉不到

三、事务

在日常生活中,我们进行转账时,对方进行转账,我接受转账,让双方都成功时,转账才算成功

事务就是如此,将多个SQL语句打包成一个整体,如果成功,那么都所有语句都会执行完毕;如果失败,那么所有语句都不会执行.在数据库进行操作的过程中失败以后,也不是真正的没有执行,而是将执行过的语句回滚,从而恢复现场.

如何回滚?数据库中有专门用来记录事务的日志.因此,当使用事务时,SQL语句使用的开销是更大的,效率也是更低的.

开启事务

//开始事务,从此语句之后的所有语句都要打包执行
strat transaction ;//结束事务,当此语句执行后,事务执行完毕
commit

事务的特性

原子性(最核心的特性)

一致性(类似于转账)

持久性(数据库的内容都是写在硬盘上的,从而具有长期保存性)

隔离性('并发'执行事务引起的问题)

所谓并发:服务器同时处理多个客户端的请求

如果客户端所给服务器发的事务,作用的不是同一个表/数据,那么一般不会出现问题;如果是作用于同一个表/数据,那么极有可能出现问题

对于并发执行事务可能产生的问题

1.脏读问题(脏指的是读到的数据是无效数据)

一个事务正在对数据进行修改的过程中,还没提交之前

另外一个事务,对同一个数据进行了读取

此时,读取数据的事务的操作就称为”脏读”,读到的数据也是”脏数据”

如何解决

MySQL引入”写操作加锁”这样的机制(也就是写的时候不能读)

这个操作,降低了并发程度(也就是降低了效率),但是提高了隔离性(提高了数据的准确性)

2.不可重复读

事务1已经提交了数据,事务2开始去读取数据

读取过程中,事务3又提交了新的数据

此时意味着同一个事务2之内,多次读数据,读出来的结果是不相同的

(预期是一个事务中,多次读取的结果是相同的)

如何解决

MySQL引入”给读操作加锁”这样的机制(也就是读的时候,不能写)

这个操作,又进一步降低了事务的并发处理能力(处理效率降低)

提高了事务的隔离性(数据的准确性又增加了)

3.幻读

已经约定了读加锁和写加锁,解决了不可重复和脏读问题

在读加锁和写加锁的前提下,一个事务两次读取同一个数据

发现读取的数据值是一样的,但是结果集不一样(对当前读的没改变,但是出现另一个代码)

如何解决

数据库使用”串行化”这样的方式来解决幻读,彻底放弃并发处理事务,一个接一个的串行处理事务

这样做,并发程度是最低的(效率是最慢的),但隔离性是最高的(准确性也是最高的)

数据库内部采取的机制:

read  uncommitted  无任何限制

read  committed  给写加锁

repeatable  read  给写和读加锁

serializable  串行化

上述都是数据库内部机制,可以通过修改MySQL的配置文件,来设置当前MySQL工作在哪种状态下

接下来就是最后的JDBC后,多谢各位读者大佬观看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102709.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

在学习的时候找到几个十分好的工程和个人博客,先码一下,内容都摘自其中,有些重难点做了补充! 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

unity3d---物体加点击事件

目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 2d…

6. 树的入门

6. 树的入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 6.1 树的基本定义 …

PerformanceTest, monitoring command

PerformanceTest, monitoring command 1、数据库 #查看最大连接数 show variables like max_connections; #例如:查看mysql连接数 show status like Threads%; 说明: threads_cached //查看线程缓存内的线程的数量 threads_connected //查看当前打开的连接的数量(打开的…

Pytorch的几种常用优化器

文章目录 AdagradSGDRMSpropAdamAdamW Adagrad Adagrad是一种可以自动调节每个参数更新的梯度的优化器,也可以做到在梯度平缓时走的步长大,在梯度小时走的步长小,从而防止loss出现剧烈震荡的情况。这里默认你已知道了他的原理了,…

离散数学-考纲版-01-命题逻辑

文章目录 1. 命题逻辑的等值演算与推理演算参考1.1 命题1.2 常用联结词1.3 命题公式命题公式的分类-重言式-矛盾式-可满足式等价关系式-逻辑等价 logically equivalent 1.4 命题的等值演算与推理基本等价式逻辑蕴涵重言式 logically implication重言蕴涵推到归结法 1.5 命题公式…

机器学习——SVM的易错题型

问:支持向量机仅可以用于处理二分类任务 答:错误。支持向量机可以用于处理多分类任务,通过使用一对多或一对一的方法,将多个类别分别与其他类别做二分类。也可以使用多类支持向量机算法,直接将多个类别一起纳入训练和…

3、Typescript中补充的六个类型

1、元组 元组可以看做是数组的拓展,它表示已知元素数量和类型的数组。确切地说,是已知数组中每一个位置上的元素的 类型,来看例子: let tuple: [string, number, boolean]; tuple ["a", 2, false]; tuple [2, "…

网络设备发现工具

什么是网络设备发现 网络设备发现是识别和映射网络基础架构(如路由器、交换机、集线器、防火墙、无线接入点、服务器、虚拟机等)中存在的设备和接口的过程。网络发现是网络管理的第一步,也是成功监控解决方案的关键。该过程不仅涉及发现网络…

LINUX SVN 新建项目

从第三方代码创建代码库: 1、通过客户端进入服务端 2、在对应的目录创建新的项目/目录 在对应的目录右击 :creat folder... 例:创建testSvn 3、在客户端checkout(co) testSvn 4、将第三方源码(srcTest)拷贝到客户端下的对应路径 防止L…

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层 遇到问题初始化底图初始化高程(监听载入完成事件,开启关闭高程)初始化 3dtile在线示例 Cesium 最新版(1.104.0&#…

DIN11系列 大电流输出信号隔离模块线性驱动器0~100mA/0~500mA/0~2A/0-4A

主要特性 精度、线性度误差等级: 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入0~100mA/0~500mA/0~1A/0-5A 等电流信号输出0~1V(max 5A)/0~10V/0-24V(max 5A) 等电压信号输出信号输入/信号输出 3000VDC 隔离辅助电源:12V、15V 或 24V 直流单电源供…

NeRFStudio系列 Part 1:PipeLines概述

前言:Why NeRFStudio? NeRF社区是近两年来计算机领域最活跃的学术社区之一,各种具有milestone意义的算法层出不穷,各位作者的开源工作也做得非常扎实,非常多的工作都自带了code、data、project page。 但是后继者想要在这些伟大的…

jenkins自动化部署配置

文章目录 1. jenkins 插件安装2. 配置2.1 全局工具配置2.2 全局配置2.2.1 gitee 配置 3. 创建任务添加gitee ssh jenkins 开机自启动 1. jenkins 插件安装 ant Build Failure AnalyzerBuild Monitor ViewBuild Timeout dockerEmail Extension Plugin giteegithubgradle javama…

Python科研数据可视化

在过去的20 年中,随着社会产生数据的大量增加,对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身,所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”,对于数量、规模与复杂性不断增加的数据&…

广域通信网 - 流量控制(停等协议、滑动窗口协议)

文章目录 1 概述2 流量控制协议2.1 停等协议2.2 滑动窗口协议 1 概述 #mermaid-svg-c9cNIYsOvLpoO4AV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-c9cNIYsOvLpoO4AV .error-icon{fill:#552222;}#mermaid-svg-c9c…

跳槽必备,全面总结Android面试知识点

在最近的 Android 开发(社招)面试中总结的 Android 基础知识点,已经拿到心仪的offer,回馈同学们,感谢其他大佬的分享。 Android中大厂面试都很重视基础知识的考察,面试前不仅要熟悉这些知识点,…

设计模式之访问者模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、访问者模式是什么? 访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作…

智能家居代码架构---简单工厂模式

(11条消息) 智能家居 (10) ——人脸识别祥云平台编程使用(编译libcurl库支持SSL,安装SSL依赖库libssl、libcrypto)openssl 依赖库行稳方能走远的博客-CSDN博客 看上面这个博客的往期文章 代码设计经验的总结,稳定,拓展性更强。一系列编程思…

DAX:概述ALL函数

简单的说,当ALL用作表函数时,忽略应用到表上的任何过滤器,并返回数据表;当ALL用作CALCULATE和CALCULATETABLE函数中修饰器时,ALL函数从扩展表中移除已经应用的过滤上下文。 注意自动存在(auto-eixist)对ALL()函数的影响…