Mysql游标触发器和事件

本文详细介绍了MySQL中的游标、触发器和事件的使用。通过示例展示了如何利用游标进行数据操作,创建和执行存储过程,以及如何定义和使用触发器来维护数据一致性。同时,还阐述了事件的概念,包括如何创建一次性或周期性的定时任务,并提供了修改事件的方法。这些内容对于理解MySQL的高级特性及其在实际数据库管理中的应用至关重要。
摘要由CSDN通过智能技术生成

Mysql游标触发器和事件

  1. 循环

    • drop table if exists num;
      create table num(
      num int
      );
      select * from num; 
      
    • while do

      • drop procedure if exists ins1;
        #利用循环添加数据
        delimiter //
        create procedure ins1()
        begin
        declare i int; #定义变量
        set i = 1; #给变量赋值
        while i <= 5 do
        insert into num values(i);
        set i=i+1;
        end while;
        end //
        					
        #执行, 
        call ins1();
        
    • repeat until

      • drop procedure if exists ins2;
        delimiter //
        create procedure ins2()
        begin
        declare i int default 6; 
        #定义变量并给默认值
        repeat
        insert into num values(i);
        set i = i+1;
        until i>10
        end repeat;
        end //
        #执行
        call ins2();
        
    • loop

      • drop procedure if exists ins3;
        delimiter //
         create procedure ins3()
        begin
        declare i int default 11;
        loop_i:loop
        insert into num values(i);
        set i=i+1;
        if i>=15 then 
        leave loop_i;
        end if;
        end loop;
        end //
        #执行
        call ins3();
        
  2. 游标

    • 游标相当于一个用来指定一条单一数据的标识,类似于索引值也就是下标值
    1. 定义游标
      • declare 游标名 cursor for 查询语句;
    2. 打开游标
      • open 游标名;
    3. 取值
      • fetch 游标名 into 值1,值2…;
    4. 关闭游标
      • close 游标名;
    • drp procedure if exists getMes;
      delimiter //
      create procedure getMes()
      begin
      #定义变量
      declare en varchar(20);
      declare jb varchar(20);
      declare sa int;
      #创建游标
      declare getM cursor for select ename,job,sal from emp;
      open getM; #打开游标
      fetch getM into en,jb,sa; #赋值
      close getM; #关闭游标
      select en,jb,sa; #游标默认取出第一条数据
      end //
      #执行
      call getMes();
      					
      drop table if exists users;
      create table users(
      id int,
      name varchar(20),
      sex varchar(2)
      );
      select * from users;
      insert into users values(1,'宝宝','男');
      insert into users values(2,'贝贝','男');
      insert into users values(3,'亲亲','男');
      					
      drop procedure if exists up_users;
      #利用游标及存储过程修改所有性别为女
      delimiter //
      create procedure up_users()
      begin
      declare names varchar(20);
      declare no int;
      declare up_sex cursor for select name from users;
      declare continue handler for not found set no=1; #找不到时将no改为1
      set no = 0;
      open up_sex; #打开游标
      while no=0 do
      fetch up_sex into names; #取值
      update users set sex = '女' where name=names; #通过姓名更改性别
      end while;
      close up_sex;
      end //
      #执行
      call up_users();
      
  3. 触发器

    • 触发器和存储过程一样,都是嵌入到mysql中的一段程序,存储过程需要call来执行,而触发器是在执行某个操作的时候自动执行的当有多个表具有一定的相互联系的时候,触发器能够让不同的表保持数据的一致性,只有执行insert,update,delete操作的才能激活触发器,其他sql不会激活触发器;

    • 创建触发器

      create trigger 触发器名称 触发时机(before之前 after之后) 触发事件 on 哪个表上建
      for  each row 要执行的操作
      					
      drop table if exists users;
      create table users(
      id int primary key auto_increment,
      name varchar(20),
      age int 
      );
      drop table if exists log;
      create table log(
      id int primary key auto_increment,
      logtime timestamp,
      mes varchar(100)
      );
      select * from users;     
      select * from log;
      					
      #删除触发器
      drop trigger 触发器名
      drop trigger if exists user_log;
      delimiter //
      create trigger user_log after insert on users for each row
      begin
      insert into log values(null,now(),'users执行了插入操作');
      end //
      					
      insert into users values(null,'张三',20);
      insert into users values(null,'李四',30);
      
  4. 事件

    • mysql5.1版本开始引进的 event(时间触发器)概念,
      mysql中的事件是用于执行定时或周期性的任务的,
      有时候也可被称为临时触发器,事件由一个特定的线程来管理的,也就是所谓的事件调度器,但是事件不能直接调用,事件是基于特定事件周期触发来执行,触发器是基于某几个表所产生的事件而触发,这也是他们之间的区别;

    • 事件的格式

      • create 
        #可选,用于定义事件执行时检查权限
        definer 
        #可选,用于判断要创建的事件是否存在
        if not exists
        #必选,用于指定事件名
        event 事件名
        #必须,用于定义执行的时间和间隔
        on schedule 执行计划
        #可选,用于定义时间是否循环执行
        #at 时间戳,用于完成单次计划任务
        #every 单位,用于完成重复的计划任务
        on completion [not] preserve
        #可选,用于指定事件的一种属性
        #关键字enable表示该事件是活动的
        #关键子disable表示该事件是关闭的
        #关键字disable on slave表示事件是关闭的,如果不指定这三个选择中的任意一个,
        #则一个事件创建之后,它立即变为活动的;
        enable | disable | disable on slave
        #可选,用于定义注释
        comment '注释内容'
        #必选,用于指定事件启动时要执行的内容
        #可以是任何有效的sql语句,存储过程或者一个计划执行的事件
        #如果包含多条,可以使用begin  end复合结构
        do 内容
        
    • 创建事件

      • 注意:使用事件前必须确保event_scheduler已开启 如果未开启执行set global event_scheduler=1;

      • drop table if exists users;
        create table users(
        id int primary key auto_increment,
        name varchar(20),
        age int
        );
        			
        select * from users;
        
      • 2.1创建立即启动事件
        create event insertUsersEvent1
        on schedule at now()
        do insert into users values(null,'小白',20);
        					
        2.2 创建一个10秒后启动事件
        create event insertUserEvent2
        on schedule at current_timestamp+interval 10 second
        do insert into users values(null,'小红',30);
        					
        					
        2.3 创建重复执行事件
        create event isnertUserEvent3
        on schedule every 15 second
        on completion preserve disable
        do 
        begin
        insert into users values(null,'事件1',20);
        insert into users values(null,'事件2',30);
        end
        
    • 修改事件

      • 与创建事件格式基本相同

        • alter
      • #必选,用于指定事件名
        event 事件名
        #必须,用于定义执行的时间和间隔
        on schedule 执行计划
        #可选,用于定义时间是否循环执行
        #at 时间戳,用于完成单次计划任务
        #every 单位,用于完成重复的计划任务
        on completion [not] preserve
        #可选,用于指定事件的一种属性
        #关键字enable表示该事件是活动的 关键子disable表示该事件是关闭的
        #关键字disable on slave表示事件是关闭的,如果不指定这三个选择中的任意一个,
        #则一个事件创建之后,它立即变为活动的;
        enable | disable | disable on slave
        #可选,用于定义注释
        comment '注释内容'
        #必选,用于指定事件启动时要执行的内容
        #可以是任何有效的sql语句,存储过程或者一个计划执行的事件
        #如果包含多条,可以使用begin  end复合结构
        do 内容
        					
        通过修改事件将一个事件临时关闭或再次活动
        alter event 事件名 disable; --关闭事件
        alter event 事件名 on completion preserve enable; #开启定时任务
        alter event 事件名 on completion preserve disable; #关闭定时任务
        alter event isnertUserEvent3 on completion preserve enable;
        alter event isnertUserEvent3 on completion preserve disable;
        select * from users;
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值