MySQL 事件执行基于 Table DATETIME
MySQL Event Execution Based on Table DATETIME
是否可以在集合中 DATETIME 的每个给定实例(即 table 的列)的 MySQL 运行 中有一个事件?
我有一个 table 需要根据该行中的 DATETIME 更新列。 table 的简化视图如下所示:
+--------------+---------------------+------------------+
| 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 是不可能的。
或者我想我可以创建一个事件到 运行 每秒更新一次所有 'Sent' 行到 'Executed' 如果他们的时间是过去的,但我想知道是否有更多 'real-time' 方法可以做到这一点。
也许更好的方法是构建一个视图来显示 'Executed' 如果状态是 'Sent' 并且时间是过去?
SCHEDULE AT
语法不接受根据 event creation syntax 的任何类型的查询。您仅限于时间戳和可选间隔。
您可以 create a trigger 在 table 中插入或更新行以在未来的时间戳创建新事件。但是,您现在必须担心为每个未来事件创建唯一的事件名称并管理系统中可能存在的大量事件。
在大多数情况下,更好的选择是为您的应用程序创建一个按合理时间间隔安排的新事件,该事件将查询需要处理的所有行,然后执行该逻辑。
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
会在适当的时间启动这些作业。
是否可以在集合中 DATETIME 的每个给定实例(即 table 的列)的 MySQL 运行 中有一个事件?
我有一个 table 需要根据该行中的 DATETIME 更新列。 table 的简化视图如下所示:
+--------------+---------------------+------------------+
| 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 是不可能的。
或者我想我可以创建一个事件到 运行 每秒更新一次所有 'Sent' 行到 'Executed' 如果他们的时间是过去的,但我想知道是否有更多 'real-time' 方法可以做到这一点。
也许更好的方法是构建一个视图来显示 'Executed' 如果状态是 'Sent' 并且时间是过去?
SCHEDULE AT
语法不接受根据 event creation syntax 的任何类型的查询。您仅限于时间戳和可选间隔。
您可以 create a trigger 在 table 中插入或更新行以在未来的时间戳创建新事件。但是,您现在必须担心为每个未来事件创建唯一的事件名称并管理系统中可能存在的大量事件。
在大多数情况下,更好的选择是为您的应用程序创建一个按合理时间间隔安排的新事件,该事件将查询需要处理的所有行,然后执行该逻辑。
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
会在适当的时间启动这些作业。