• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL中触发器和游标的介绍与使用

    触发器简介

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

    触发器的优点:

    MySQL 中使用触发器

    创建触发器

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

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

    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
    

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

    触发器新旧记录

    MySQL 中定义了 NEW 和 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;
    

    游标

    游标简介

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

    创建游标

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

    创建一个过程 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触发器和游标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MySQL系列之五 视图、存储函数、存储过程、触发器
    • MySQL触发器的使用
    • mysql触发器trigger实例详解
    • MySQL 触发器的使用和理解
    • 一篇文章带你深入了解Mysql触发器
    上一篇:mysql千万级数据量根据索引优化查询速度的实现
    下一篇:MySQL8.0.23免安装版配置详细教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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