MySQL游标和触发器的操作流程

2025-12-08 20:50

本文主要是介绍MySQL游标和触发器的操作流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看...

游标

使用SELECT语句可以返回符合指定条件的结果集(虚拟表),但没有办法对结果集中的数据进行单独的处理。例如,使用SELECT语句查询出多条员工信息的结果集后,无法获取结果集中的单条记录。为此,mysql提供了游标机制,利用游标可以对结果集中的数据进行单独处理

游标的操作流程

1. 定义游标

DECLARE 游标名称 CURSON FOR SELECT语句

特点:游标名称必须唯一,因为在存储过程和函数中可以存储多个游标,而游标名就是区分不同游标的唯一标志。另外SELECT语句中不能含有INTO关键字。需要注意的是,变量、错误触发条件、错误处理程序和游标都是通过DECLARE定义的,但他们的定义是有先后顺序要求的。变量和错误触发条件必须在最前面声明,然后是游标的声明,最后才是错误处理程序的声明。

2.打开游标

OPEN游标名称

3.利用游标检索数据

FETCH 游标名称 INTO 变量名1 [,变量名2]...

每执行一次FETCH语句就在结果集中获取一行记录,FETCH语句获取记录后,游标的内部指针就会向前移动一步,指向下一条记录。并将获取到的记录存入对应的变量中,其中变量名的个数要和SELECT语句查询出来的结果集一致。

FETCH语句一般和循环语句一起完成数据的检索,它通常和REPEjsAT循环语句一起使用。因为无法直接判断哪条记录是结果集中的最后一条记录,当利用游标从结果集中检索出最后一条记录后,再次执行FETCH语句,将产生ERROR 1329 (02000):No data to FETCH错误信息。因此,使用游标时通常自定义错误处理程序处理该错误,从而结束游标的循环。

4.关闭游标

CLOSE 游标名称

在程序内,如果使用CLOSE关闭了游标,则不能再通过FETCH使用该游标。如果想要再次利用游标检索数据,只需要使用OPEN打开游标即可,而不用重新定义游标。如果没有使用CLOSE关闭游标,那么它将在被打开的BEGIN...END语句块的末尾关闭。

例题

技术人员想将员工表emp中奖金为NULL的员工信息存放在一个新的数据表emp_comm中,数据表emp_comm的结构和员工表保持一致

原表如下

MySQL游标和触发器的操作流程

创建一个存http://www.chinasem.cn储过程,实现将奖金为NULL的员工信息添加到数据表emp_comm

然后定义存储过程如下

DELIMITER // -- 修改MySQL语句默认结束符号为//
CREATE PROCEDURE proc_emp_comm() -- 创建名为proc_emp_comm()的存储过程
BEGIN -- 开始存储过程
DECLARE mark INT DEFAULT 0; -- 定义了变量mark用于存储游标结束循环的标识
# 定义变量用来存储select语句查询出来的8个字段数据
DECLARE emp_no INT;
DECLARE emp_name VARCHAR(20);
DECLARE emp_job VARCHAR(20);
DECLARE emp_mgr INT;
DECLARE emp_hiredate DATE;
DECLARE emp_sal DECIMAL(7,2);
DECLARE emp_comm DECIMAL(7,2);
DECLARE emp_deptno INT;
DECLARE cur CURSOR FOR SELECT * FROM emp WHERE comm IS NULL; -- # 定义游标
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' -- 定义错误程序及处理方式
 SET mark=1;
# 打开游标
OPEN cur;
# 借助repeat循环,移动指针获取虚拟结果集中的数据,存储到定义的变量中
REPEAT -- 开启循环
FETCH cur INTO emp_no,emp_name,emp_job,emp_mgr,emp_hiredate,emp_sal,emp_comm,emp_deptno; -- 使用上面定义的8个字段去接收查询语句查询出来的数据
IF mark!=1 THEN -- 只要mark值不为1,说明结果集中还有数据,就将数据添加到emp_comm表中
 INSERT INTO emp_comm VALUES(emp_no,emp_namandroide,emp_job,emp_mgr,emp_hiredate,emp_sal,emp_comm,emp_deptno);
END IF; -- 结束if语句
UNTIL mark=1 END REPEAT; -- 结束repeat循环语句
CLOSE cur; -- 关闭游标
END // -- 结束存储过程
DELIMITER ; -- 设置MySQL命令结束符号为;
 

调用存储过程

CALL proc_emp_comm();

查看emp_comm表数据

SELECT * FROM emp_comm;

MySQL游标和触发器的操作流程

触发器

在实际开发项目时,如果需要在数据表发生更改时自动进行一些处理,这时就可以使用触发器。

例如,删除一条数据时,需要在数据库中保留一个备份副本,这种情况下可以创建一个触发器对象,每当删除一条数据时,就执行一次备份操作。

触发器可以看成一种特殊的存储过程,它不用CALL语句调用,而是在预选定义好的操作自动调用(INSERT,DELETE)等

触发器具有以下优点

当触发器相关联的数据表中的数据发生修改时,触发器中定义的语句会自动执行。

触发器对数据进行安全校验,保障数据安全。

通过和触发器相关联的表,可以实现表数据的级联更改,在一定程度上保证数据的完整性。

触发器的基本操作

1.创建触发器

CREATE TRIGGER 触发器名称 触发时机 触发事件 ON 数据表名 FOR EACH ROW 触发程序

  • 触发器名称:必须在当前数据库中唯一。如果要在指定的数据库中创建触发器,触发器名称前面应该加上数据库的名称。
  • 触发时机:指触发程序执行的时间,可选值有BEFORE和AFTER;其中BEFORE表示在触发事件之前执行触发小程序,AFTER表示在触发事件之后执行触发程序。
  • 触发事件:表示激活触发器的操作类型,可选值有INSERT、UPDATE和DELETE;其中INSERT表示将新纪录插入表时激活触发器中的触发程序,UPDATE表示更改表中某一条记录时激活触发器中的触发程序,DELETE表示删除表中某一行记录时激活触发器中的触发程序。
  • 触发程序:指的是触发器执行的SQL语句,如果要执行多条语句,可使用BEGIN...END作为语句的开始和结束。触发程序中可以使用NEW和OLD分别表示新记录和旧记录。例如,当需要访问数新插入记录的字段值时,可以使用“NEW.字段名”方式访问;当修改数据表的某条记录时,可以使用“OLD.字段名”访问修改之前的字段值。

2.查看触发器

SHOW TRIGGERS;

利用SELECT语句查看数据库information_schema下数据表trigges中的触发器数据

SELECT * FROM information_schema.triggers [WHERE trigger_name = '触发器名称'];

3. 触发触发器

根据定义的触发器知道,执行删除操作时,会触发触发器的执行(下面的例题)
DELETE FROM emp WHERE empno=8888;

MySQL游标和触发器的操作流程

4. 删除触发器

DROP TRIGGER [IF EXISTS] [数据库名.]触发器名;-- DELETE一般删除表中数据,其他为DROP

DROP TRIjavascriptGGER IF EXISTS trig_emp;(下面例题)

例题

技术人员想要在删除员工信息后,自动将删除的员工信息添加在其他数据表,以防后续需要查询被删除的员工信息

 首先创建一个新的表,用来存储删除的数据,这个表的字段和emp表的字段一样

CREATE TABLE `emp_del` (
  `empno` INT DEFAULT NULL,
  `ename` VARCHAR(50) DEFAULT NULL,
  `job` VARCHAR(50) DEFAULT NULL,
  `mgr` INT DEFAULT NULL,
  `hiredate` DATE DEFAULT NULL,
  `sal` DECIMAL(7,2) DEFAULT NULL,
  `comm` DECIMAL(7,2) DEFAULT NULL,
  `deptno` INT DEFAULT NULL
);

接着在员工表emp中创建触发器。当
删除员工表的数据后,触发该触发器,
并且在触发器的触发程序中将被删除的员工信息添加到数据表emp_del

# CREATE TRIGGER 触发器名称 触发时机 触发事件 ON 数据表名 FOR EACH ROW 触发程序

DELIMITER //
CREATE TRIGGER trig_emp
AFTER DELETE ON emp
FOR EACH ROW
BEGIN
    INSERT INTO emp_del(empno, ename, job, mgr, hiredate, sal, comm, deptno)
    VALUES(OLD.empno, OLD.ename, OLD.job, androidOLD.mgr, OLD.hiredate, OLD.sal, OLD.comm, OLD.deptno);
END //
DELIMITER ;

接着根据定义的触发器知道,执行删除操作时,会触发触发器的执行

-- 删除员工编号为 8888 的记录
DELETE FROM emp WHERE empno = 8888;
-- 删除员工编号为 7369 的记录
DELETE FROM emp WHERE empno = 7369;

MySQL游标和触发器的操作流程

查看触发器

SHOW TRIGGERS;

MySQL游标和触发器的操作流程

到此这篇关于MySQL游标和触发器的操作流程的文章就介绍到这了,更多相关mysql游标和触发器内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MySQL游标和触发器的操作流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156398

相关文章

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数