使用MySQL表中的特定新数据安排更新

时间:2018-10-23 08:27:34

标签: mysql events schedule

我想知道是否有什么办法可以安排更新,即在旧数据过期时更新表数据。

例如约翰·史密斯(John Smith)在X公司有一个现役服务,但想升级该服务。但是,由于他当前协议的限制,这项新服务要等X天后才能生效。

有什么方法可以存储新数据并在一个月末在MySQL中对其进行更新?如果是,这是否需要我再存储一张包含新订单数据的表?

2 个答案:

答案 0 :(得分:0)

有趣的是,mysql的事件调度程序可以查看documentation

下面是一个最小的CREATE EVENT语句的示例:

CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
  UPDATE myschema.mytable SET mycol = mycol + 1;

上一条语句创建一个名为myevent的事件。通过运行一条使myschema.mytable表的mycol列的值增加1的SQL语句,此事件在创建后一小时内执行一次。

  

如果是,这是否需要我再存储一张包含新订单数据的表

我不确定您是否需要另一个表...这完全取决于您希望它成为一个表

答案 1 :(得分:0)

通常,通过在start_date表中放置end_dateservices列来满足将来更改事物的要求。

然后您可以使用

找到当前处于活动状态的服务行
   SELECT user_id, whatever, whatelse
     FROM services
    WHERE (start_date IS NULL OR start_date <= NOW())
      AND (end_date IS NULL OR end_date > NOW());

如果愿意,可以创建一个名为active_services的视图,以自动过滤当前活动服务的services表。

 CREATE VIEW active_services AS
   SELECT *
     FROM services
    WHERE (start_date IS NULL OR start_date <= NOW())
      AND (end_date IS NULL OR end_date > NOW());

请注意-在这种设计中,end_date包含不是服务激活的最后一刻,而是服务未激活的第一刻。如果end_date为null,则该服务将继续处于活动状态。

要在下个月初更改服务或user_id,请执行以下两项操作:

  UPDATE service
     SET end_date = LAST_DAY(NOW()) + INTERVAL 1 DAY
   WHERE user_id = <<user id you wish to change >>

  INSERT INTO service (start_date, user_id, whatever, whatelse)
          VALUES (LAST_DAY(NOW()) + INTERVAL 1 DAY,
                  <<user id you wish to change >>,
                  <<whatever>>, 
                  <<whatelse>>;

然后,下个月到达时,active_services视图将返回新服务。这比依靠精确定时的每月工作要强大得多。如果您每月进行工作,则它可以随时运行。它只是清除过期的服务。

您可以使用MySQL事件在指定的时间运行特定的作业。 (但是某些共享的MySQL系统不允许您使用事件。)