0

我想创建一个事件,当一lend_date列正好经过 15 天时,它将执行一个INSERT查询。

它将获取该行的 ID 和userid,并将其插入到另一个表中。

例如:

id |  userid  |    lend_date
---+----------+----------------------
1  |    1     |  2015-09-24 15:58:48
2  |    1     |  2015-09-21 08:22:48

而现在,正是2015-10-06 08:23:41。所以事件应该得到第二行的ID,即2,并将其插入到另一个表中。

我的事件查询应该是什么样的?

事件类型是RECURRING。但我也不确定我应该每小时还是每天执行一次。最好的建议是什么?

这是比使用更好的方法Task Scheduler吗?

我想插入获取的 ID 的另一个表是notification_table,它将通知用户他/她有一个过期日期。

notification_table看起来像这样:

id |  userid  |  notificationid  |   notificationdate   |
---+----------+------------------+----------------------+
1  |    1     |        1         |  2015-09-24 15:58:48 |
2  |    1     |        1         |  2015-09-21 08:22:48 | 

我正在查看这个查询:

INSERT INTO notification_table (id, userid, notificationid, notificationdate) 
        SELECT id, userid, 1, NOW() 
        FROM first_table
        WHERE lend_date + INTERVAL 15 DAY = NOW();
4

1 回答 1

0

准确地 看到这些词,事件,和datetime在同一个句子中让我畏缩。为什么?一方面,很难让一个datetime值与另一个值完全匹配。另一方面,事件通常在预定时间之后稍微运行,尤其是在繁忙的数据库服务器上。他们需要一点时间来启动。

如果您需要id记录超过 15 天的表中的值,获取它们的最精确的时间方法是使用查询或视图。

 CREATE OR REPLACE VIEW fifteen 
     AS SELECT id
          FROM table
         WHERE `datetime` < NOW() - INTERVAL 15 DAY

当然,您可以编写一个事件来将 id 复制到新表中。通过在事件中使用这种查询,您将不得不费力地确保您不会多次点击相同的 id 值。

   INSERT INTO newtable (id)
        SELECT id
          FROM table
         WHERE `datetime` < NOW() - INTERVAL 15 DAY
           AND id NOT IN (SELECT id FROM newtable) 

您应该多久运行一次重复事件?这完全取决于 id 值在十五天后需要多快才能进入新表。如果您的应用程序要求它少于一分钟,那么您真的应该使用视图而不是事件。任何超过一分钟的允许延迟都会让您以该频率使用重复事件。

于 2015-10-06T02:02:37.233 回答