當前位置:
首頁 > 知識 > mysql定時任務和存儲過程的小例子

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 "2018-07-13 16: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定時任務和存儲過程的小例子

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

較全Vim快捷鍵鍵點陣圖(入門到進階)
C++ 中指針和引用的區別

TAG:程序員小新人學習 |