逆天十三少

发表于:2020-11-12 08:12 阅读: 90次

这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一起学习!

一、游标

1.1、越界标志

在MySQL游标中,可以声明DECLARE CONTINUE HANDLER来操作1个越界标志。

语法:DECLARE CONTINUE HANDLER FOR NOT FOUND STATEMENT;

1.2、REPEAT方式

DELIMITER $$CREATE PROCEDURECHANGESEX ()BEGIN

DECLARE HAVE INT DEFAULT 1;DECLARE PID INT;DECLARE CURT CURSOR FOR SELECT ID FROMSTUDY11;DECLARE CONTINUE HANDLER FOR NOT FOUND SET HAVE=0;OPENCURT;FETCH CURT INTOPID;

REPEATUPDATE STUDY11 SET SEX=CASE SEX WHEN '男' THEN 'MALE' ELSE 'FEMALE' END WHERE ID=PID;FETCH CURT INTOPID;

UNTIL HAVE=0 ENDREPEAT;CLOSECURT;END$$

DELIMITER ;

需要注意的是:MySQL不能像SQL Server那样,使用DEALLOCATE的方式释放游标资源。

1.3、WHILE方式

DELIMITER $$CREATE PROCEDURECHANGESEX1 ()BEGIN

DECLARE HAVE INT DEFAULT 1;DECLARE PID INT;DECLARE CURT CURSOR FOR SELECT ID FROMSTUDY11;DECLARE CONTINUE HANDLER FOR NOT FOUND SET HAVE=0;OPENCURT;FETCH CURT INTOPID;WHILE HAVE=1DOUPDATE STUDY11 SET SEX=CASE SEX WHEN 'MALE' THEN '男' ELSE '女' END WHERE ID=PID;FETCH CURT INTOPID;END WHILE;CLOSECURT;END$$

DELIMITER ;

二、动态SQL

2.1、动态SQL格式

SET SQL=(预处理的SQL语句,可以使用CONCAT拼接的语句,参数用 ?代替 。);SET @SQL=SQL;PREPARE STMT_NAME FROM @SQL;SET @VAR_NAME=XXX;EXECUTE STMT_NAME [USING @VAR_NAME[,@VAR_NAME]...];

{DEALLOCATE | DROP} PREPARE STMT_NAME;

2.2、动态SQL示例

DELIMITER $$CREATE PROCEDURE GETNAME (IN PID INT)BEGIN#定义预处理SQL语句DECLARE STRSQL VARCHAR(1000);

#拼接SQL语句SET STRSQL="SELECT NAME FROM EMP WHERE ID=?";

#将自定义变量赋值给用户变量SET @SQL=STRSQL;

#预处理动态SQL语句PREPARE STMT FROM @SQL;

#传递动态SQL参数SET @PARAM1=PID;

#执行动态SQL语句EXECUTE STMT USING @PARAM1;

#释放PREPAREDEALLOCATE PREPARESTMT;END$$

DELIMITER ;

可以看出,MySQL动态SQL支持""。

2.3、动态SQL注意事项

1)存储动态SQL的值的变量不能是自定义变量,必须是用户变量或者全局变量 。如:SET SQL='XXX';PREPARE STMT FROM SQL;都是错误的写法,正确的写法为:SET @SQL='XXX';PREPARE STMT FROM @SQL;

2)即使PREPARABLE_STMT语句中的 ? 所代表的是一个字符串,也不需要用引号将 ? 两边包起来。

3)如果动态语句中用到了 IN ,则SQL语句可以写成:SET STRSQL="SELECT NAME FROM EMP WHERE ID IN (?,?,?)";

三、临时表

3.1、临时表创建

方法一:

CREATE TEMPORARY TABLE`emp_t1` (

`ID`int(11) DEFAULT NULL,

`NAME`varchar(50) DEFAULT NULL,

`AGE`int(11) DEFAULT NULL,KEY`ID_INDEX` (`ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

方法二:

CREATE TEMPORARY TABLE emp_t2 SELECT * FROM EMP WHERE ID<=10;

可以看出,MySQL并不支持像SQL Server那样使用SELECT * INTO #EMP FROM EMP的方式来创建临时表。

3.2、临时表删除

DROP TABLE EMP_T1,EMP_T2;

3.3、临时表测试(存储过程)

1)创建:

DELIMITER $$CREATE PROCEDURETempTest1 ()BEGIN#临时表创建方式一测试CREATE TEMPORARY TABLE`emp_t1` (

`ID`int(11) DEFAULT NULL,

`NAME`varchar(50) DEFAULT NULL,

`AGE`int(11) DEFAULT NULL,KEY`ID_INDEX` (`ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO EMP_T1 SELECT * FROM EMP LIMIT 10;

#临时表创建方式二测试CREATE TEMPORARY TABLE emp_t2 SELECT * FROM EMP WHERE ID<=10;

#结果返回SELECT * FROM EMP_T1 UNION SELECT * FROMEMP_T2;

#临时表删除DROP TABLEEMP_T1,EMP_T2;END$$

DELIMITER ;

2)调用:

CALL TempTest1();

3)结果:

3.4、自定义函数能使用临时表吗?

不可以!自定义函数不支持创建表,不管是正常表还是临时表。(SQL Server自定义函数,也不支持临时表,但是支持表变量。)

四、事务

4.1、基础概念

事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。

4.2、MySQL逻辑架构与存储引擎

如上图所示,MySQL逻辑架构从上往下可以分为三层:

1)第一层:处理客户端连接、授权认证等。

2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。

3)第三层:存储引擎,负责MySQL中数据的存储和提取。

说明1:MySQL中服务器层不管理事务,事务是由存储引擎实现的。

说明2:MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。

4.3、事务控制语句

1)BEGIN 或 START TRANSACTION 显式地开启一个事务;

2)COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

3)ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

4)SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

5)RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

6)ROLLBACK TO identifier 把事务回滚到标记点;

7)SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

4.4、事务提交模式

SET AUTOCOMMIT=1 开启自动提交

SET AUTOCOMMIT=0 禁止自动提交

默认是开启自动提交,可以使用以下命令查询:

SHOW VARIABLES LIKE 'AUTOCOMMIT';

4.5、事务示例

4.5.1、无判断语句事务

DELIMITER $$CREATE PROCEDURETranTest1 ()BEGIN#临时表创建CREATE TEMPORARY TABLE EMP_T1 SELECT * FROM EMP WHERE 1=2;

#开启事务

STARTTRANSACTION;

#数据插入INSERT INTO EMP_T1 VALUES (1,'HELLO',18);INSERT INTO EMP_T1 VALUES (2,'WORLD',19);

#提交事务COMMIT;

#结果返回SELECT * FROMEMP_T1;

#临时表删除DROP TABLEEMP_T1;END$$

DELIMITER ;

4.5.2、有判断语句事务(推荐)

DELIMITER $$CREATE PROCEDURETranTest2 ()BEGIN#判断事务是否异常的错误变量DECLARE PERROR INT DEFAULT 0;DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET PERROR=1;

#临时表创建CREATE TEMPORARY TABLE EMP_T1 SELECT * FROM EMP WHERE 1=2;

#开启事务

STARTTRANSACTION;

#数据插入INSERT INTO EMP_T1 VALUES (1,'HELLO',18);INSERT INTO EMP_T1 VALUES (2,'WORLD',19);

#提交事务IF (PERROR=0) THEN

COMMIT;ELSE

ROLLBACK;END IF;

#结果返回SELECT * FROMEMP_T1;

#临时表删除DROP TABLEEMP_T1;END$$

DELIMITER ;

说明:SQL Server中事务执行是否有报错,可以使用@@ERROR来判断,@@ERROR=0代表无报错。

以上就是MySQL学习笔记十:游标/动态SQL/临时表/事务的全部内容,希望对大家的学习有所帮助,如果觉得有用给我点个赞吧,同时也希望大家多多支持酷码派。

分类: 数据库

43

38

mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务相关推荐

  1. mysql 分组链接_MySQL学习笔记(四)——分组函数,分组查询,链接查询

    MySQL学习笔记(四)--分组函数,分组查询,链接查询 做者:就叫易易好了 日期:2020/11/18 1.分组函数 功能:用做统计使用,又称为聚合函数或统计函数mysql 分类:web sum函数 ...

  2. mysql innodb 事务_MySQL学习笔记之InnoDB事务实现

    我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式. 同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. 所以 ...

  3. mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结

    本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法.分享给大家供大家参考,具体如下: 1. primary key 主键 特点:主键是用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能 ...

  4. mybatis学习笔记四(动态sql)

    直接贴图,注解在代码上,其他的配置文件在学习一中就不贴了 1 数据库 2 实体类 package com.home.entity;/*** 此类是: 用户实体类* @author hpc* @2017 ...

  5. mysql三大范式_MySQL学习笔记

    1.数据库结构设计 1.总-总体流程图 2.分-[提取属性]业务分析 评价的属性:{用户,课程主标题,内容,综合评分,内容实用,简洁易懂,逻辑分析,发布时间} 问答评论属性:{类型,标题,内容,关联章 ...

  6. Mysql成语数据库_mysql学习笔记

    今天开始学习mysql数据库了,也是第一次在这里写技术笔记,相信好记忆不如烂笔头,就以此来见证自己的成长吧! 首先安装mysql服务器的过程这里就不啰嗦啦,相信大家都懂的,直接进入主题吧,欢迎那些也是 ...

  7. MySQL编程技巧_MySQL学习笔记---MySQL开发技巧

    SQL语句分类 DDL:数据定义语言 --- CREATE.ALTER.DROP.TRUNCATE TPL:事务处理语言 --- COMMIT.ROLLBACK.SAVEPOINT.SET TRANS ...

  8. mysql数据库管理指导_mysql学习笔记一(数据库管理控制)

    一.数据库常用命令 1 创建数据库 1.1 创建mydb1数据库,使用默认字符集 create database mydb1; 1.2 创建数据库mydb2,字符集使用utf8 create data ...

  9. mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考

    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型. ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定哪 ...

最新文章

  1. Windows远程桌面连接并传输文件
  2. 十年后,这是25个你会习以为常的AI应用场景
  3. 2009_01_15_星期三
  4. python爬虫技术可以干什么-Python实战:网络爬虫都能干什么?
  5. 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
  6. 最小二乘抛物线拟合原理及证明
  7. 比较HTML元素和Native组件的区别
  8. 有PHP4的分支吗?
  9. 正向代理 smtp imap_Nginx代理模式及区别
  10. 高通audio数据到Speaker播放流程
  11. Linux 程序运行时报错:找不到库文件[cannot open shared object file: No such file or directory ```](转载)
  12. linq 根据指定条件返回集合中不重复的元素
  13. 公钥,私钥,数字签名,证书
  14. Java项目:员工出差请假考勤管理系统(java+JSP+LayUI+HTML+servlet+Mysql)
  15. C#2种类型时间戳(秒时间戳、毫秒时间戳)
  16. oracle的over和group,分组函数group by 和分析函数over()
  17. 论文阅读:Neural Machine Translation By Jointly Learning To Align And Translate
  18. 如何提高逻辑思维能力
  19. 微信小程序配置多环境
  20. 相关性分析和热图绘制

热门文章

  1. 使用threading模块实现多线程
  2. 无线路由器连接电信光纤宽带光猫设置方法(转)
  3. oracle 11g 及 plsqldeveloper 相关操作
  4. 2009.12.9.工作日记
  5. 自写保存字符串或文件为asp.net缓存的类
  6. React源码之 从开始说起
  7. [NOIP2016]换教室(概率期望$DP$)
  8. 第十五章,读取txt文件(C++)
  9. cocos编译java时改变使用的javac的版本
  10. BCG-MFC 库对《支持重新启动管理器》都做了些什么