是否可以在一个集合中的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中无法在动态的日期时间上运行。
或者我想我可以创建一个事件,每秒运行一次,将所有'已发送'行更新为'已执行',如果他们的时间过去,但我想知道是否有更'实时'的方式这样做。
如果状态为“已发送”并且时间已过去,或许更好的方法是构建一个显示“已执行”的视图?
答案 0 :(得分:1)
根据event creation syntax,SCHEDULE 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
会在适当的时间启动这些作业。