Mysql游标触发器和事件
-
循环
-
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();
-
-
-
游标
- 游标相当于一个用来指定一条单一数据的标识,类似于索引值也就是下标值
- 定义游标
- declare 游标名 cursor for 查询语句;
- 打开游标
- open 游标名;
- 取值
- fetch 游标名 into 值1,值2…;
- 关闭游标
- 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();
-
触发器
-
触发器和存储过程一样,都是嵌入到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);
-
-
事件
-
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;
-
-