MySQL 系统学习系列 - 事务、视图与存储过程的使用《MySQL系列篇-06》

news2024/11/14 3:07:18

数据库事务、视图、存储过程

事务

1. 事务简介

  • 事务(transaction)是指访问并更新数据库中各种数据的一个程序执行单元(unit) [最小执行单元]

  • MySQL事务主要用于处理操作量大。复杂度高的数据

    • 1.MySQL数据库只有InnoDB引擎支持事务
    • 2.事务维护数据的完整性(全执行或全不执行)
    • 3.事务用来管理 INSERT,UPDATE,DELETE 语句
  • 事务的事务特性(ACID)▲:

    • 1.原子性(A):要么全部执行,要么全部不执行
    • 2.一致性(C):再事务开始之前和结束事务之后,数据库的完整性没有被破坏
    • 3.隔离性(I):允许多个事务同时执行(并发),隔离性…
    • 4.持久性(D):事务操作完后,重启不会消失…
    • 以后在重新理解

2. 事务控制语句

  • 在这里插入图片描述

  • autocommit: 该变量用于设置是否自动提交事务默认为1自动提交,也可以改为0非自动提交

    • 不管autocommit是0还是1:BEGIN/START TRANSACTION后,只有当commit数据才会生效,rollback后就会回滚(默认回滚到最前)
    • 当autocommit为0时,不管有没有 BEGIN/START TRANSACTION,只有当commit数据才会生效,rollback后就会回滚
    • 查看autocommit变量:SHOW VARIABLES LIKE 'autocommit';查看变量的语句 show variables like '表量名'
    • 设置autocommit变量:SET autocommit = 0
  • # 开启与提交事务
        begin; -- 开启事务
          INSERT INTO stu_sw VALUES("zhangsan","G");
          INSERT INTO stu_sw VALUES("lisi","M");
          -- 事务语句区 ...........
        commit; -- 提交事务
      
    # 回滚事务
        begin; -- 开启事务
          INSERT INTO stu_sw VALUES("zhangsan","G");
          rollback; -- 回滚事务 [会自动提交事务,默认回滚到数据最前面]
          INSERT INTO stu_sw VALUES("lisi","M");
        commit; -- 提交事务
      
    # 事务标记点与回滚事务
        begin; -- 开启事务
          INSERT INTO stu_sw VALUES("zhangsan","G");
          SAVEPOINT p1; -- 创建事务标记点
          INSERT INTO stu_sw VALUES("lisi","M");
          rollback to p1; -- 回滚到p1标记点
        commit; -- 提交事务
      
    /**
        当把事务自动提交关闭后,如果没有commit提交事务,就算添加的数据能通过select中查看,也是无效的数据
        可以理解为该数据只能在本机上的黑窗口中查看 【隔离机制】
     */
    

3. 其它

视图

视图是从一个或多个基本表(或视图)中导出的虚拟的表。视图不可以与表重名。数据多用于查询,一般不会通过视图去修改数据

视图的特点:

  • 1.视图能简化用户的操作
  • 2.视图能增加安全性
  • 3.视图对重构数据库提供了一定程度的逻辑独立性

视图的操作

  • 在这里插入图片描述

  • # 视图操作的基本语法
      -- 创建视图
        create view 视图名称 as SQL语句
    
      -- 修改视图
        alter view 视图名称 as SQL语句
      
      -- 删除视图
        drop view 视图名称
    

视图练习[理解视图操作]

  • 数据表与数据的准备

    • CREATE TABLE stu_view( -- 创建stu——view用于视图的练习
          id INT NOT NULL PRIMARY KEY auto_increment,
          age int,
          sid char(20),
          sex bit,
          name char(20),
          isDelete bit DEFAULT 0
      );
      -- 数据插入
        INSERT INTO stu_view(age,sex,name) VALUES(18,1,"kong");
        INSERT INTO stu_view(age,sid,sex,name) VALUES(18,'',1,"wang");
        INSERT INTO stu_view(age,sex,name) VALUES(36,1,"deng"),(20,1,"gaoPP"),(30,1,"hello"),(30,1,"hahaha");
        INSERT INTO stu_view(age,sid,sex,name) VALUES(34,1,"kong%");
      
  • 视图操作部分

    • # 假设:需要经常过滤id大于3的学生中,对年龄过滤20,30,40 【一般写法如下】
          SELECT * FROM (SELECT * FROM stu_view WHERE id>3) as s WHERE age>20;
          SELECT * FROM (SELECT * FROM stu_view WHERE id>3) as s WHERE age>30;
          SELECT * FROM (SELECT * FROM stu_view WHERE id>3) as s WHERE age>40;
        
      # 通过视图实现上面的操作
          CREATE VIEW v_stu as SELECT * FROM stu_view WHERE id>3; -- 将 [SELECT * FROM stu_view WHERE id>3] 创建为一个单独的视图
          -----------------------------该3条语句等价于上面的3条语句--------------------------------------------
            SELECT * FROM v_stu as s WHERE age>20; 
            SELECT * FROM v_stu as s WHERE age>30;
            SELECT * FROM v_stu as s WHERE age>40;
          -- 可以将视图理解为编程中的一个函数,能够大大的减少代码耦合 【使用该查找语句时,就可以直接使用视图名称即可】
        
      # 修改视图:alter view 视图名称 as SQL
          ALTER VIEW v_stu as SELECT * FROM stu_view WHERE id>5; -- 将v_stu视图修改为id>5的select查询语句
        
      # 删除视图:drop view 视图名称
          DROP VIEW v_stu; -- 删除v_stu视图
      
  • 视图可以理解为编程中封装一个常用的操作一样,可以直接将比较常用的SQL语句封装成一个视图,需要时直接使用视图名称语句即可

  • 视图可以大大的降低比较常用的SQL语句的耦合…

  • 总结:视图多用于查询频率比较高的语句或逻辑较为复杂的场景【如网站的首页、网站顶部的筛选过滤…】

存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中经过第一次编译后调用不需要再次编译,
用户通过指定存储过程的名字并给出参数(如果存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

语法:

  • create procedure 存储过程名()
    BEGIN
        一定功能的sql语句
    END
    
    call 存储过程名 -- 调用存储过程
    
    -- 存储过程多用于数据的检验
    

扩充知识:

  • 1.通过 delimiter 语句来修改mysql语句的默认结束符 【注意使用该语句时不需要加结束符】
  • 2.通过 declare 变量名 类型 默认值.. 来定义一个变量
  • 3.通过 set 语句可以修改变量的值

基本使用【演示_后面自行深入】:

  • -- 库与表的准备
       CREATE DATABASE db_sp; -- 数据库的创建
       USE db_sp; -- 使用db_sp库
       CREATE TABLE t_sp( -- 表结构创建
           name varchar(25),
           age INT
       );
    -- ---------------------------------- 问题:向t_sp中插入3条数据[使用存储过程] ----------------------------------
       delimiter $$ -- 修改sql语句的结束符【用于创建存储过程时可以使用;隔开语句而不执行(区分整体)】
       CREATE PROCEDURE add_val() -- 定义存储过程
       BEGIN
       -- ------------------逻辑语句部分【存储过程语句部分】------------------
           DECLARE i INT DEFAULT 1; -- 定义变量 i
           WHILE i<4 DO -- 使用while循环(集体使用后面在学[自行学习])
               INSERT INTO db_sp.t_sp(name,age) VALUES("kong",1);   
               SET i=i+1; -- 每循环一次i自加1
           END WHILE;
       END$$ -- 结束存储过程
       delimiter ; -- 定义完存储过程后,将sql结束符恢复默认值
      
       call add_val(); -- 调用存储过程
      
    -- 相当于封装了一个函数,也可以使用参数来动态的添加数据............
    -- 其它操作与逻辑操作等,后面找时间再自行学习 [false]
      
    

查看存储过程

  • 查看当前存在的存储过程:show procedure status
  • 查看特定数据
    • 确定数据库名: show procedure status where db=数据库名
    • 不确定数据库名(模糊查找): show procedure status where name like 模糊的数据库名

删除存储过程 drop procedure 存储过程名

存储过程可以理解为就是一个编程中的函数,调用存储过程时也可以传参,并且存储过程也可以写一些逻辑判断等(如while循环、if判断…)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App应用冷启动耗时排查

1 查看冷启动耗时 adb shell am start -S -W com.gerry.lifecycle/com.gerry.lifecycle.MainActivity发现冷启动耗时居然要6s多&#xff0c;下面开始排查 2 生成trace文件 // Application中开始trace记录 override fun attachBaseContext(base: Context?) {super.attachBas…

虚幻5|简单的设置角色受到伤害,远程攻击机关设置,制作UI,低血量UI

虚幻5|制作玩家血量&#xff0c;体力&#xff08;还未编辑&#xff0c;只用于引用&#xff09;-CSDN博客 需完成制作玩家血量及体力部分 一.给角色添加死亡动画 1.为了保证角色在播放死亡蒙太奇的时候&#xff0c;不会重新播放&#xff0c;而是保持原来倒地的姿势&#xff0…

Renesa Version Board开发RT-Thread 之WIFI创建Client

概述 本文主要介绍使用Renesa Version Board中WIFI功能&#xff0c;该模块基于RW007模块设计&#xff0c;RT-Thread软件架构已经实现该硬件相关的驱动接口。笔者基于该模块的相关接口在LWIP软件框架的基础上实现Client功能。实现数据的发送和接收。 1 WLAN 框架简介 参考文档…

【Java】—— Java面向对象基础:使用Java创建和打印员工对象信息

在Java中&#xff0c;类的定义和使用是面向对象编程的核心。本文将通过一个简单的例子来展示如何定义一个员工类&#xff08;Employee&#xff09;&#xff0c;并在测试类中创建员工对象&#xff0c;为这些对象的属性赋值&#xff0c;并打印出它们的信息。 定义员工类&#xff…

大模型微调

文章目录 前言一、使用的库二、数据预处理1.引入库2.读入数据3.对数据进行预处理4.转换为json格式文件 三&#xff0c;使用算子分析数据并进行数据处理四&#xff0c;划分训练集和测试集五&#xff0c;编写训练脚本开始训练六&#xff0c;进行模型推理人工评估总结 前言 这是使…

网络优化|单源最短路|Dijkstra|Floyd|Matlab

图和网络可以用来描述集合元素和元素之间关系。大量的最优化问题都可以抽象为网络模型加以解释&#xff0c;描述和求解。 图与网络模型在建模时具有直观、易理解、适应性强等&#xff0c;广泛应用在管理科学、物理学、化学、计算机科学、信息论、控制论、社会科学以及军事科学等…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

嵌入式开发技术进步带来新机遇

嵌入式开发作为信息技术领域的重要分支&#xff0c;随着科技的不断进步&#xff0c;正迎来新的机遇。本文将从人工智能、物联网、边缘计算等方面探讨嵌入式开发技术的进步如何带来新的发展机遇&#xff0c;并展望未来的发展趋势。 一、引言 嵌入式系统是一种特殊的计算机系统&…

unreal engine5中character角色和怪物交互时发生穿模

UE5系列文章目录 文章目录 UE5系列文章目录前言一、原因定位二、解决方法 前言 在 Unreal Engine 5 中&#xff0c;角色“穿模”通常指的是角色模型与其他物体&#xff08;如墙壁、地面或其他对象&#xff09;发生不正确的穿透或重叠现象。这可能是由多种原因造成的&#xff0…

C++ | Leetcode C++题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {const int MOD 1337;int pow(int x, int n) {int res 1;while (n) {if (n % 2) {res (long) res * x % MOD;}x (long) x * x % MOD;n / 2;}return res;}public:int superPow(int a, vector<int> &b) {int an…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

NetSuite 2024.2 学习笔记

NetSuite一年两次的发版&#xff0c;每次都会带来一些新的东西。这对于顾问来说&#xff0c;应该成为必修课。 每个版本发版内容的学习时长&#xff0c;大约在20小时左右。包括&#xff1a; •Release Notes通读 •Release Preview环境申请 •热点功能验证 •New Release学习笔…

vue中video视频路径改变,dom不更新问题

效果展示 视频切换前 视频切换后 完整代码 <template><!-- 设置v-if只在路径有值时&#xff0c;标签才存在 --><video v-if"state.videoSrc ! null" controls><source :src"state.videoSrc" type"video/mp4"></…

Java | Leetcode Java题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {static final int MOD 1337;public int superPow(int a, int[] b) {int ans 1;for (int e : b) {ans (int) ((long) pow(ans, 10) * pow(a, e) % MOD);}return ans;}public int pow(int x, int n) {int res 1;while (n…

Pytorch实现CIFAR10训练模型

文章目录 简述模型结构模型参数、优化器、损失函数参数初始化优化器损失函数 模型训练、测试集预测、模型保存、日志记录训练测试集测试模型保存模型训练完整代码 tensorboard训练可视化结果train_loss测试准确率测试集loss 模型应用模型独立应用代码api.py预测结果 简述 使用…

leetcode1232一点小问题

解法 a x 2 − x 1 y 2 − y 1 &#xff0c; b y 1 − a x 1 a\frac{x_{2}-x_{1}}{y_{2}-y_{1}} &#xff0c;by_{1}-ax_{1} ay2​−y1​x2​−x1​​&#xff0c;by1​−ax1​ d y n − y n − 1 x n − x n − 1 d\frac{y_{n}-y_{n-1}}{x_{n}-x_{n-1}} dxn​−xn−1​yn​…

【初阶数据结构】链表题的证明

环形链表题目方法的证明 证明1&#xff1a;为什么快指针每次⾛两步&#xff0c;慢指针⾛⼀步可以相遇&#xff0c;有没有可能遇不上&#xff0c;请推理证明&#xff01; 证明二&#xff1a;为什么相遇点&#xff08;meet&#xff09;和头结点&#xff08;head&#xff09;到入环…

sql server导入mysql,使用工具SQLyog

概述 需要将sql server的数据导入到mysql中&#xff0c;由于2种数据库存在各种差异&#xff0c;比如表字段类型就有很多不同&#xff0c;因此需要工具来实现。 这里使用SQLyog来实现。 SQLyog安装 安装过程参考文档&#xff1a;https://blog.csdn.net/Sunshine_liang1/article/…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

JVM对象创建和内存分配机制深度解析

一、对象创建方式 1、new关键字 这是最常见的创建对象的方式。通过调用类的构造方法&#xff08;constructor&#xff09;来创建对象。如&#xff1a;MyClass obj new MyClass()。这种方式会触发类的加载、链接、初始化过程&#xff08;如果类还未被加载过的话&#xff09;&…