思考:通常咱们的数据都是存储在数据库里面,对于常规的CRUD操做都是用代码实现,好比使用PHP作项目,全部的数据处理都须要主动操做代码实现。若是咱们如今有一项目,业务须要在用户下单后,对用户的订单进行分润处理,好比在每月的21号,对上个月全部的订单按设置的规则进行分润处理,固然shll脚本也能够实现,可是今天咱们说的是如何经过数据库“存储过程”和“事件”来实现。html
1、以下图,是MySQL官网所介绍的https://dev.mysql.com/doc/refman/5.5/en/stored-objects.htmlmysql
一、简单的理解“存储过程”就是咱们平时写的SQL的集合,里面可能包含IF判断或者posLoop:LOOP循环和咱们平时写PHP代码差很少,就是为了实现某个操做(CRUD);sql
“事件”,就是咱们设置的一个自动开关,能够按照咱们设置的时间,好比天天12:00或者每分钟处理一次(调用你写的存储过程)。数据库
二、好比咱们经常使用的Navicat的数据库管理工具,第一个栏目是咱们经常使用的“表”,第三个和第四个就是咱们所说的“存储过程”和“事件”。数组
2、简单的需求。工具
一、好比咱们有一张表 t_user,须要每2分钟处理一下,若是 type 字段值为 1,则把 num 的值修改成 500。oop
二、新建一个过程spa
三、具体SQL代码。代码大体说明一下:code
:SQL里面全部须要用到的变量,都须要先定义,全部咱们先定义了一下三个变量。htm
:而后建立游标,至关于咱们代码里面先获取数据,获取一个二维数组的 List ,而且把它放在 cur_test 里面,若是游标内容执行完成,就将 done的值设置为 1 。
:打开游标,至关于开始获取到这个变量。开始循环,至关于咱们常常作的 foreach 循环数组操做,先判断下,而后取出游标中的值,赋值给 定义好的变量。至关于咱们key 和 value 键名 键值,而后判断知足即修改。
:最后结束循环的标示和释放游标。
:能够点击运行,若是没有问题就能够查看是否更改数据,有问题会有提示错误。
BEGIN #处理t_user若是type = 1,则将num修改成200 #定义变量 DECLARE done int;#定义游标标记 DECLARE t_id int;#定义须要处理的id值 DECLARE t_type int;#定义记录值类型 #建立游标,并存储数据 DECLARE cur_test CURSOR FOR SELECT id,type FROM t_user LIMIT 500; #游标中的内容执行完后将done设置为1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; #打开游标 OPEN cur_test; #执行循环 posLoop:LOOP #判断是否结束循环 IF done = 1 THEN LEAVE posLoop; END IF; #取游标中的值 FETCH cur_test INTO t_id,t_type; #若是type = 1,则将num修改成200 IF t_type = 1 THEN #执行更新操做 UPDATE t_user SET num = 200 WHERE id = t_id; END IF; #结束循环 END LOOP posLoop; #释放游标 CLOSE cur_test; END
四、建立 “事件”调用写好的过程 p_t3()。调用 存储过程 通常用 CALL + 过程名。
五、点击保存时,可能提示 “event_scheduler = OFF” 未开启,咱们开启下便可,指令以下。注意,每次重启MySQL后,该值会设为 off 须要从新开启一下。
#开启 SET GLOBAL event_scheduler = ON; #关闭 SET GLOBAL event_scheduler = OFF;
最后:只要数据库服务开启,每分钟都会调用一次p_t3(),实现里面的业务规则。第一个简单存储过程加事件的调用,到此为止,至于为何SQL里面这样写,咱们往下看个人“MySQL实现定时清理过时数据”篇。