基于表DATETIME的MySQL事件执行

时间:2015-03-23 19:39:31

标签: mysql sql datetime events

是否可以在一个集合中的DATETIME的每个给定实例(即表的一列)中运行MySQL中的事件?

我有一个表需要根据该行中的DATETIME更新列。该表的简化视图如下所示:

+--------------+---------------------+------------------+
|      ID      |     Execution       |     Status       |
+--------------+---------------------+------------------+
|     5        | 2016-01-01+00:00:00 |     Sent         |
+--------------+---------------------+------------------+

||
||   when 2016/01/01+00:00:00 occurs
VV

+--------------+---------------------+------------------+
|      ID      |     Execution       |     Status       |
+--------------+---------------------+------------------+
|     5        | 2016-01-01+00:00:00 |     Executed     |
+--------------+---------------------+------------------+

我认为CREATE EVENT语法看起来像:

CREATE EVENT <name> ON SCHEDULE AT (SELECT Execution FROM <table> WHERE Status = 'Sent')
DO BEGIN
  -- perform procedure here
END

如果可以的话,它会引入一些问题。 MySQL会多久检查一次这个集合中的新事件,还是在创建时拉出一个静态集?它过去的日期时间如何表现?它会简单地运行吗?从这些问题中我可以假设在SQL中无法在动态的日期时间上运行。

或者我想我可以创建一个事件,每秒运行一次,将所有'已发送'行更新为'已执行',如果他们的时间过去,但我想知道是否有更'实时'的方式这样做。

如果状态为“已发送”并且时间已过去,或许更好的方法是构建一个显示“已执行”的视图?

2 个答案:

答案 0 :(得分:1)

根据event creation syntaxSCHEDULE AT语法不接受任何类型的查询。您只限于时间戳和可选间隔。

您可以create a trigger插入或更新该表中的行,以便在将来的时间戳创建新事件。但是,您现在必须担心为每个未来事件创建一个唯一的事件名称,并管理系统中可能存在的大量事件。

在大多数情况下,更好的选择是为您的应用程序创建一个以合理间隔安排的新事件,该事件将查询需要处理的所有行,然后执行该逻辑。

答案 1 :(得分:0)

linux中的cron实用程序将为您完成此操作。我不相信mysql中存在这样的功能。

此命令允许您编辑crontab文件

crontab -e

sudo crontab -e

然后添加一个看起来像这样的新行:

* * * * * mysql -u x -p y script.sql

这将每分钟运行一次并执行您的script.sql。如果你想对你的主人更友好,你可以每小时运行一次:

0 * * * * mysql -u x -p y script.sql

或者,您可以运行PHP脚本而不是SQL脚本。基本上,您可以从命令行执行的任何操作都可以从cron完成。请注意,它将作为另一个用户和不同的环境运行。

或者(如果您可以在不同服务器上访问cron但不能在要运行脚本的服务器上访问),则可以使用完全不同的服务器(或easycron.com或setcronjob.com) - 不推荐这些服务器 - 我刚刚用google找到了它们,它在你的服务器上做了一个PHP页面的wget。然后,服务器上的PHP页面可以执行您想要执行的逻辑。

在每种情况下,您都可以首先检查您的日期时间列,看看是否有任何您想要做的事情,然后再找到它。

如果您在同一台服务器上运行,理论上您可以每隔一定时间间隔(例如午夜)运行,并查询当天的所有日期,并在这些时间创建at个工作。因此,cron脚本会根据您的数据创建at个作业,然后at会在适当的时间启动这些作业。