mysql定时任务和存储过程的小例子

emmm其实网上优秀的文章有很多,并且mysql也有官方文档,写这个是相当于记录自己的经历吧。

上面说升级的那里,是要执行一个定时任务,每三天执行一次。然后情况如下:

一个商品表,商品有一个id的属性,然后每个商品有关键词信息,对应一个商品-关键词中间表(通过商品id、关键词id为一个主键),关键词其他信息又存放在另一个表里面,这时候要统计商品表的关键词数量,因为实时统计耗费的时间太多了,只能通过定期更新的方式,并作为商品的一个属性。

商品表的每个商品都要进行更新的话,就用到游标来处理,大概思路是这样,首先从商品表获取每个商品的id形成一个集合,然后用游标和while循环遍历每个id,把id拿去中间表里面找到所有关键词id,再把这些关键词id去关键词表查找得出关键词的总数(一个商品对应多个关键词,需要把这些关键词的数量统计出来)

其实重点在于游标的应用和存储过程的应用(语法挺重要的),贴上代码:

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `test`.`yinliucount_new`()
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN
    DECLARE goodsid VARCHAR(255);
    DECLARE keywordgoodsid VARCHAR(255);
    DECLARE yinliuc INT;
    DECLARE done INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT goodsurlid FROM store_goods;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    FETCH cur INTO goodsid;
    WHILE done != 1 DO
    SET keywordgoodsid = SUBSTRING_INDEX(goodsid,"_",-1);      
    SELECT COUNT(*) INTO yinliuc FROM (SELECT * FROM store_allkeyword WHERE keywordid IN(SELECT keywordid FROM store_goods_keyword WHERE goodsurlid = keywordgoodsid) GROUP BY keyword_name)d;    
    IF yinliuc IS NOT NULL THEN
    UPDATE store_goods SET yinliu_count = yinliuc WHERE goodsurlid = goodsid;
    END IF;          
    FETCH cur INTO goodsid;
    END WHILE;        
    CLOSE cur;

    END$$

DELIMITER ;

然后用 新建一个定时任务,注释都是一些例子

DELIMITER $$

-- SET GLOBAL event_scheduler = ON$$     -- required for event to execute but not create    

CREATE	/*[DEFINER = { user | CURRENT_USER }]*/	EVENT `weanalysis`.`d`

ON SCHEDULE EVERY 2 DAY STARTS '2018-07-13 16:00:00'
ON COMPLETION PRESERVE
ENABLE
	 /* uncomment the example below you want to use */

	-- scheduleexample 1: run once

	   --  AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }

	-- scheduleexample 2: run at intervals forever after creation

	   -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]

	-- scheduleexample 3: specified start time, end time and interval for execution
	   /*EVERY 1  [HOUR|MONTH|WEEK|DAY|MINUTE|...]

	   STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }

	   ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */

/*[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']*/

DO
	BEGIN
	    CALL test.`yinliucount_new`;
	END$$

DELIMITER ;
然后就设置好了,其他具体的语法,是要去看mysql官方文档还有别人的博客的,我就不班门弄斧了,这个只是一个参考的小例子。


猜你喜欢

转载自blog.csdn.net/weixin_37703281/article/details/81036481