如何使用msql安排事件

时间:2017-07-07 20:59:38

标签: mysql events

我试图制作一个每1小时执行一次的活动。

这是代码。

mysql> DROP EVENT IF EXISTS `clean`;

CREATE EVENT IF NOT EXISTS `clean`
       ON SCHEDULE
         EVERY 1 HOUR
         STARTS '2017-07-07 16:00.00'
         DO
           SET @isTime = IF(table_name.programed_time = NOW(), 'y', 'n');
           IF @isTime = 'y' THEN DELETE FROM `cell_name`
             WHERE `cell_name` = 'value'

我希望活动仅在星期一的16:00运行。所以在我的应用程序中,我有代码将每个月的第一个星期一的日期保存在16:00的表格中。

但是当我运行此查询时,我遇到此错误。

Unknown type of declaration near to IF.
Something is wrong in its syntax near 'IF @isTime ='y' 
THEN DELETE FROM `cell_name` WHERE `cell_name 'in the line

有人可以告诉我我做错了什么。

3 个答案:

答案 0 :(得分:1)

在mysql中调度事件涉及到了解触发器的工作原理。看看这个详细的教程,我相信它会走很长的路。 https://www.sitepoint.com/how-to-create-mysql-events/

  

可选地

基于您的问题,我真的相信cronjob最适合您的需求。看看这篇文章。 https://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

答案 1 :(得分:1)

由于您的活动有多个声明,您的问题可能是您需要将定义转换为以下内容:

DELIMITER $$
CREATE EVENT IF NOT EXISTS `clean` ON SCHEDULE EVERY 1 HOUR STARTS '2017-07-07 16:00.00'
DO
BEGIN
   DECLARE isTime CHAR(1);
   SET isTime := IF(table_name.programed_time = NOW(), 'y', 'n');
   IF isTime = 'y' THEN 
      DELETE FROM `cell_name` WHERE `cell_name` = 'value';
   END IF;
END$$

DELIMITER ;

基本上,将身体括在BEGIN... END

答案 2 :(得分:0)

我找到了做我想做的最好的方法,而不必创建变量或将日期存储在数据库中。

这是我使用的代码。

DROP EVENT IF EXISTS `clean`;

DELIMITER //

CREATE EVENT IF NOT EXISTS `clean`
       ON SCHEDULE
         EVERY 1 DAY
         STARTS '2017-01-27 16:00.00'
         COMMENT 'EVENT runs daily at 4 pm. DELETE executed first Monday month'
         DO
           BEGIN
             IF (DAYOFMONTH(NOW()) BETWEEN 1 AND 7 AND
                 DAYNAME(NOW()) = 'Monday') THEN
               DELETE FROM `table_name`
               WHERE `cell_name` = 'value';
             END IF;
           END//

DELIMITER ;