it编程 > 数据库 > Mysql

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

6人参与 2025-12-08 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
触发器执行的语句块;

说明:

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游标触发器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MySQL回滚binlog日志的实现示例

12-08

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

12-08

使用 MySQL Workbench 进行高效数据库设计

12-08

解决Navicat导入DBF中文乱码的问题

12-08

MySQL实现读写分离架构的原理与实现方法

12-08

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

12-08

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论