MySQL中触发器和游标的介绍与使用

触发器简介

触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。

触发器的优点:

  • 安全性:可以基于数据库的值使用户具有操作数据库的某种权利。例如不允许下班后和节假日修改数据 库数据;
  • 审计:可以跟踪用户对数据库的操作;
  • 实现复杂的数据完整性规则。例如,触发器可回退任何企图吃进超过自己保证金的期货;
  • 提供了运行计划任务的另一种方法。例如,如果公司的帐号上的资金低于 5 万元则立即给财务人员发送 警告数据。

MySQL 中使用触发器

创建触发器

创建触发器的技巧就是记住触发器的四要素:

  • 监控地点:table;
  • 监控事件:insert/update/delete;
  • 触发时间:after/before;
  • 触发事件:insert/update/delete。

创建触发器的基本语法如下所示:

CREATE TRIGGER
-- trigger_name:触发器的名称;
-- tirgger_time:触发时机,为 BEFORE 或者 AFTER;
-- trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;
 trigger_name trigger_time trigger_event
 ON
 -- tb_name:表示建立触发器的表名,在哪张表上建立触发器;
 tb_name
 -- FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。
 FOR EACH ROW
 -- trigger_stmt:触发器的程序体,可以是一条 SQL 语句或者是用 BEGIN 和 END 包含的多条语句;
 trigger_stmt
  • trigger_name:触发器的名称;
  • tirgger_time:触发时机,为 BEFORE 或者 AFTER;
  • trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;
  • tb_name:表示建立触发器的表名,在哪张表上建立触发器;
  • trigger_stmt:触发器的程序体,可以是一条 SQL 语句或者是用 BEGIN 和 END 包含的多条语句;
  • FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。

注意:对同一个表相同触发时间的相同触发事件,只能定义一个触发器。

触发器新旧记录

MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据:

  • 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE或已经(AFTER)插入的新数据;
  • 在 UPDATE型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新 数据;
  • 在 DELETE型触发器中,OLD 用来表示将要或已经被删除的原数据。

创建触发器,当用户购买商品时,同时更新对应商品库存记录,代码如下所示:

-- 删除触发器,drop trigger 触发器名称
-- if exists判断存在才会删除
drop trigger if exists myty1;
-- 创建触发器
create trigger mytg1-- myty1触发器的名称
after insert on orders-- orders在哪张表上建立触发器;
for each row
begin
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,2,1);
-- 查询商品表商品库存更新情况
select * from product;

创建触发器,当用户删除订单时,同时更新对应商品库存记录,代码如下所示:

-- 创建触发器
create trigger mytg2
after delete on orders
for each ROW
begin
-- 对库存进行回退,重新加上
	update product set num = num+old.num where pid=old.pid;
end;
-- 删除订单记录
delete from orders where oid = 2;
-- 查询商品表商品库存更新情况
select * from product;

before 和 after 的区别

before 在执行语句之前after 在执行语句之后

当订单商品数量超过库存时,修改订单数量为最大库存:

-- -- 创建 before 触发器
create trigger mytg3
before insert on orders
for each row
begin
	-- 定义一个变量,来接收库存
	declare n int default 0;
	-- 查询库存 把num赋值给n
	select num into n from product where pid = new.pid;
	-- 判断下单的数量是否大于库存量
	if new.num>n then
		-- 大于修改下单库存(库存改为最大量)
	set new.num = n;
	end if;
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,3,50);
-- 查询商品表商品库存更新情况
select * from product;
-- 查询订单表
select * from orders;

游标

游标简介

游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。游标有下面这些特征

  • 游标是只读的,也就是不能更新它;
  • 游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录;
  • 避免在已经打开游标的表上更新数据。

创建游标

创建游标的语法包含四个部分:

  • 定义游标:declare 游标名 cursor for select 语句;
  • 打开游标:open 游标名;
  • 获取结果:fetch游标名 into 变量名[,变量名];
  • 关闭游标:close 游标名;

创建一个过程 p1,使用游标返回 test 数据库中 student 表的第一个学生信息。代码如下所示:

-- 定义过程
create procedure p1()
begin
	declare id int;
	declare name varchar(20);
	declare age int;
	-- 定义游标 declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	fetch mc into id,name,age;
	-- 打印
	select id,name,age;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p1();

在 test 数据库创建一个 student2 表,创建一个过程 p2,使用游标提取 student 表中所有学生信息插入到 student2 表中。代码如下所示:

-- 定义过程
create procedure p3()
begin
	declare id int;
	declare name varchar(20);
	declare age int;
	declare flag int default 0;
	-- 定义游标 declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	declare continue handler for not found set flag=1;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	a:loop -- 循环获取数据
	fetch mc into id,name,age;
	if flag=1 then -- 当无法fetch时触发continue handler
	leave a;-- 终止循环
	end if;
	-- 进行遍历,将提取的每一行数据插入到 student2 表中
	insert into student2 values(id,name,age);
	end loop;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p3();
-- 查询 student2 表
select * from student2;

总结

到此这篇关于MySQL中触发器和游标的文章就介绍到这了,更多相关MySQL触发器和游标内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中使用游标触发器的方法

    游标 select检索返回的一组行称为结果集,结果集里的行都是根据你输入的sql语句检索出来的,如果不使用游标,你将没有办法得到第一行,前十行或者是下一行 下面是一些常见的游标现象和特性 能够标记游标为只读,是数据能够读取,但不能被更新或者删除 能控制可以执行的定向操作(向前,向后,第一,最后.绝对位置和相对位置等) 能标记某些行为可编辑的,而另一些行为不可编辑的 能规定范围,使游标对创建它的特定请求或者是所有请求可访问 Cursor declarations must appear befor

  • MySQL中触发器和游标的介绍与使用

    触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力. 触发器的优点: 安全性:可以基于数据库的值使用户具有操作数据库的某种权利.例如不允许下班后和节假日修改数据 库数据: 审计:可以跟踪用户对数据库的操作: 实现复杂的数据完整性规则.例如,触发器可回退任何企图吃进超过自己保证金的期货: 提供了运行计划任务的另一种方法.例如,如果公司的帐号上的资金低于 5 万元则立即给财务人员发送 警告数据. MySQL

  • 一文带你了解MySQL中触发器的操作

    目录 概述 介绍 触发器的特性 操作—创建触发器 操作—new和old 操作—查看触发器 操作—删除触发器 注意事项 概述 介绍 触发器,就是一种特殊的存储过程.触发器和存储过程一样是一个能够完成特定功能.存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动条用. 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,

  • Mysql中Binlog3种格式的介绍与分析

    一.Mysql Binlog格式介绍      Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能.(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,

  • MySQL中触发器入门简单实例与介绍

    创建触发器.创建触发器语法如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中trigger_name标识触发器名称,用户自行指定: trigger_time标识触发时机,用before和after替换: trigger_event标识触发事件,用insert,update和delete替换: tbl_name标识建立触发器的表名,即在哪张表上建立触发

  • MySQL中触发器的基础学习教程

    0.触发器的基本概念 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有以下的作用: (1).安全性.可以基于数据库的值使用户具有操作数据库的某种权利. # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据. # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%. (2).审计.可以跟踪用户对数据库的操作. # 审计用户操作数据库的语句. # 把用户对数

  • MySQL数据库 触发器 trigger

    目录 一.基本概念 1.作用 2.触发器的优缺点 2.1.优点 2.2.缺点 二.创建触发器 1.基本语法 2.触发对象 3.触发时机 4.触发事件 5.注意事项 需求: 三.查看触发器 四.触发触发器 五.删除触发器 六.触发器的应用 6.完善 2.优化 一.基本概念 触发器是一种特殊类型的存储过程,触发器通过事件进行触发而被执行 触发器 trigger 和js事件类似 1.作用 写入数据表前,强制检验或转换数据(保证数据安全) 触发器发生错误时,异动的结果会被撤销(事务安全) 部分数据库管理

  • 详细谈谈MYSQL中的COLLATE是什么

    前言 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `table1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1', `field2` varchar(128) COLLATE utf8_unicode_ci

  • MySQL中存储时间的最佳实践指南

    目录 前言 不要使用字符串存储时间类型 MySQL 中的日期类型 DATETIME TIMESTAMEP TIMESTAMP 的性能问题 数值型时间戳(INT) DATETIME vs TIMESTAMP vs INT,怎么选? 总结 前言 平时开发中经常需要记录时间,比如用于记录某条记录的创建时间以及修改时间.在数据库中存储时间的方式有很多种,比如 MySQL 本身就提供了日期类型,比如 DATETIME,TIMESTAMEP 等,我们也可以直接存储时间戳为 INT 类型,也有人直接将时间存储

  • 一文带你探究MySQL中的NULL

    目录 前言 1 MySQL 中的NULL 2 NULL占用的长度 3 对NULL值的比较 4 SQL对NULL值进行处理 5 值为NULL 对查询条件的影响 6 值为NULL对索引的影响 7 值为NULL对排序的影响 8 NULL和空值区别 总结 前言 不知道大家有没有遇到这样的问题,当我们在对MySQL数据库进行查询操作时,条件写的是status!=1,理论上会将所有不符合条件的查询出来,但奇怪的是结果为NULL的就查不出来,必须得拼接上条件or status IS NULL.本篇文章我们就一

  • MySQL中存储过程的详细详解

    目录 概述 优点 缺点 MySQL存储过程的定义 存储过程的基本语句格式 存储过程的使用 定义一个存储过程 定义一个有参数的存储过程 定义一个流程控制语句 IF ELSE 定义一个条件控制语句 CASE 定义一个循环语句 WHILE 定义一个循环语句 REPEAT UNTLL 定义一个循环语句 LOOP 使用存储过程插入信息 存储过程的管理 显示存储过程 显示特定数据库的存储过程 显示特定模式的存储过程 显示存储过程的源码 删除存储过程 后端调用存储过程的实现 总结 概述 由MySQL5.0 版

随机推荐