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

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

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

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

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

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

  1. DELIMITER $
  2. CREATE
  3. /*[DEFINER = { user | CURRENT_USER }]*/
  4. PROCEDURE `test`.`yinliucount_new`()
  5. /*LANGUAGE SQL
  6. | [NOT] DETERMINISTIC
  7. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  8. | SQL SECURITY { DEFINER | INVOKER }
  9. | COMMENT 'string'*/
  10. BEGIN
  11. DECLARE goodsid VARCHAR(255);
  12. DECLARE keywordgoodsid VARCHAR(255);
  13. DECLARE yinliuc INT;
  14. DECLARE done INT DEFAULT 0;
  15. DECLARE cur CURSOR FOR SELECT goodsurlid FROM store_goods;
  16. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  17. OPEN cur;
  18. FETCH cur INTO goodsid;
  19. WHILE done != 1 DO
  20. SET keywordgoodsid = SUBSTRING_INDEX(goodsid,"_",-1);
  21. 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;
  22. IF yinliuc IS NOT NULL THEN
  23. UPDATE store_goods SET yinliu_count = yinliuc WHERE goodsurlid = goodsid;
  24. END IF;
  25. FETCH cur INTO goodsid;
  26. END WHILE;
  27. CLOSE cur;
  28. END$
  29. DELIMITER ;

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

  1. DELIMITER $
  2. -- SET GLOBAL event_scheduler = ON$ -- required for event to execute but not create
  3. CREATE/*[DEFINER = { user | CURRENT_USER }]*/EVENT `weanalysis`.`d`
  4. ON SCHEDULE EVERY 2 DAY STARTS '2026-03-16T13:01:27+00:00'
  5. ON COMPLETION PRESERVE
  6. ENABLE
  7. /* uncomment the example below you want to use */
  8. -- scheduleexample 1: run once
  9. -- AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }
  10. -- scheduleexample 2: run at intervals forever after creation
  11. -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
  12. -- scheduleexample 3: specified start time, end time and interval for execution
  13. /*EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
  14. STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }
  15. ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */
  16. /*[ON COMPLETION [NOT] PRESERVE]
  17. [ENABLE | DISABLE]
  18. [COMMENT 'comment']*/
  19. DO
  20. BEGIN
  21. CALL test.`yinliucount_new`;
  22. END$
  23. DELIMITER ;

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

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