MySql 游标和触发器概念及使用详解

 更新时间:2025年12月08日 10:41:26   作者:小钟佳运  
本文详细介绍了MySQL中的游标,包括其定义、使用步骤及案例,以及触发器的概念、创建和管理,游标用于逐行处理查询结果,而触发器则在数据操作后自动执行特定操作,提升数据库操作的灵活性和自动化,感兴趣的朋友跟随小编一起看看吧

游标

1.什么是游标

MySQL游标是一种数据库对象,它用于在数据库查询过程中迭代访问结果集中的每一行。游标可以被看作是一个指向查询结果集的指针,通过移动游标,可以按行读取和处理结果集的数据。在MySQL中,游标可以用于在存储过程或函数中处理复杂的业务逻辑,例如逐行处理查询结果、循环操作数据等。使用游标可以让我们更加灵活地处理结果集。

2.使用游标的步骤

游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。如果我们想要使用游标,一般需要经历四个步骤。不同的 DBMS 中,使用游标的语法可能略有不同

2.1 声明游标

使用DECLARE关键字来声明游标,其语法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

要使用 SELECT 语句来获取数据结果集,而此时还没有开始遍历数据,这里 select_statement 代表的是SELECT 语句,返回一个用于创建游标的结果集。比如:

DECLARE cur_score CURSOR FOR
	SELECT stu_id,grade FROM score;

2.2 打开游标

OPEN 游标名称
-- 例如
open cur_score;

2.3 使用游标

这句的作用是使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。
注意:var_name必须在声明游标之前就定义好.

FETCH cursor_name INTO var_name [, var_name] ...
FETCH cur_score INTO stu_id, grade ;

注意:游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时候,MySQL 会提示错误

2.4 关闭游标

CLOSE 游标名称;
CLOSE cur_score;

3.案例

创建一个存储过程,实现累加考试成绩最高的几个学员的总分,直到总和大于我们传入的limit_total_grade的参数值,并且返回累加的人数:total_count;

CREATE PROCEDURE PROC_CURSOR(IN LIMIT_TOTAL_GRADE INT, OUT TOTAL_COUNT INT )
BEGIN
# 声明相关的变量
DECLARE SUM_GRADE INT DEFAULT 0; # 累加的总成绩
DECLARE CURSOR_GRADE INT DEFAULT 0; # 记录某条成绩
DECLARE SCORE_COUNT INT DEFAULT 0; # 记录累加的记录数
# 定义游标
DECLARE SCORE_CURSOR CURSOR FOR SELECT GRADE FROM SCORE ORDER BY GRADE ;
# 打开游标
OPEN SCORE_CURSOR;
# 使用游标
REPEAT
FETCH SCORE_CURSOR INTO CURSOR_GRADE; # 从游标中获取一条数据
SET SUM_GRADE = SUM_GRADE + CURSOR_GRADE; # 成绩累加
SET SCORE_COUNT = SCORE_COUNT + 1; # 记录累加的次数
UNTIL SUM_GRADE > LIMIT_TOTAL_GRADE # 退出条件
END REPEAT ;
# 复制OUT参数
SET TOTAL_COUNT = SCORE_COUNT;
# 关闭游标
CLOSE SCORE_CURSOR;
END;
DROP PROCEDURE PROC_CURSOR
# 调用存储过程
SET @s_count = 0;
CALL PROC_CURSOR(400,@s_count) ;
SELECT @s_count;

触发器

1.触发器概述

MySQL触发器是MySQL数据库中的一种特殊对象,它允许在表中插入、更新或删除数据时自动执行一系列指定的操作。触发器可以在特定的数据库操作(例如INSERT、UPDATE、DELETE)发生时被触发。MySQL触发器可以用于实现各种自动化任务和业务逻辑。它们可以执行诸如数据验证、审计记录、数据同步等操作。通过触发器,可以在数据库层面上处理数据相关的逻辑,避免了在应用程序中手动编写重复的代码。

2.触发器创建

2.1 语法结构

CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;

说明:

  • 表名 :表示触发器监控的对象。
  • BEFORE|AFTER :表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
    INSERT|UPDATE|DELETE :表示触发的事件。
    INSERT 表示插入记录时触发;
    UPDATE 表示更新记录时触发;
    DELETE 表示删除记录时触发。
  • 触发器执行的语句块 :可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。

2.2 代码案例

创建案例表

CREATE TABLE test_trigger (
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30) );
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);

创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。

CREATE TRIGGER BEFORE_INSERT
BEFORE INSERT ON TEST_TRIGGER
FOR EACH ROW
BEGIN
INSERT INTO TEST_TRIGGER_LOG(T_LOG)VALUES('BEFORE_INSERT ....') ;
END;

向test_trigger中插入对应的记录

insert into test_trigger(t_note)values('test data');

查看test_trigger_log中是否有记录

select * from test_trigger_log;

3.查看和删除

3.1 查看触发器

方式1:查看当前数据库的所有触发器的定义

SHOW TRIGGERS\G

方式2:查看当前数据库中某个触发器的定义

SHOW CREATE TRIGGER 触发器名

方式3:从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息

SELECT * FROM information_schema.TRIGGERS;

3.2 删除触发器

DROP TRIGGER IF EXISTS 触发器名称;

到此这篇关于MySql 游标和触发器概念及使用详解的文章就介绍到这了,更多相关mysql游标触发器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL事务的四大特性以及并发事务问题解读

    MySQL事务的四大特性以及并发事务问题解读

    这篇文章主要介绍了MySQL事务的四大特性以及并发事务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • mysql解析json数据组获取数据组所有字段的方法实例

    mysql解析json数据组获取数据组所有字段的方法实例

    mysql在5.7开始支持json解析了,也可以解析数组,下面这篇文章主要给大家介绍了关于mysql解析json数据组获取数据组所有字段的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySql游标的使用实例

    MySql游标的使用实例

    这篇文章主要介绍了MySql游标,需要的朋友可以参考下
    2014-06-06
  • Mysql 忘记root密码和修改root密码的解决方法(小结)

    Mysql 忘记root密码和修改root密码的解决方法(小结)

    这篇文章主要介绍了Mysql 忘记root密码和修改root密码的解决方法(小结),非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • MYSQL中IFNULL和NULLIF函数的区别小结

    MYSQL中IFNULL和NULLIF函数的区别小结

    IFNULL()和NULLIF()是 MySQL中两个功能完全不同的函数,它们在处理 NULL值时有着不同的用途和行为,下面就来具体介绍一下,感兴趣的可以了解一下
    2025-08-08
  • MySQL占用CPU过高排查过程及可能优化方案

    MySQL占用CPU过高排查过程及可能优化方案

    这篇文章主要介绍了MySQL占用CPU过高排查过程及可能优化方案,具有很好的参考价值,希望对大家的学习或工作有所帮助,感兴趣的朋友可以参考下
    2024-01-01
  • Mac os 解决无法使用localhost连接mysql问题

    Mac os 解决无法使用localhost连接mysql问题

    今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,下面特为大家分享下
    2014-05-05
  • window下mysql 8.0.15 安装配置方法图文教程

    window下mysql 8.0.15 安装配置方法图文教程

    这篇文章主要为大家详细介绍了window下mysql 8.0.15 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • MySQL 的 REPLACE 函数用途与语句示例详解

    MySQL 的 REPLACE 函数用途与语句示例详解

    文章介绍了MySQL的REPLACE函数和REPLACEINTO语句的用途、语法和示例,REPLACE函数用于字符串替换,而REPLACEINTO语句用于插入或替换整行记录,两者都可以在特定条件下执行写操作,但REPLACEINTO是真正的删除和插入操作,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-11-11
  • 新建一个MySQL数据库的简单教程

    新建一个MySQL数据库的简单教程

    这篇文章主要介绍了新建一个MySQL数据库的简单教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05

最新评论