【问题标题】:Why scheduled event is not deleting data from mysql database为什么计划的事件没有从 mysql 数据库中删除数据
【发布时间】:2014-11-13 00:34:09
【问题描述】:

我正在使用 php 和 mysql。在 codeigniter 中使用 date(Y-m-d H:i:s) 将数据插入到日期时间字段中。

CREATE EVENT AutoDeleteRows
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 30 SECOND 
DO 
DELETE LOW_PRIORITY FROM a_database.event_temp_users 
WHERE registration_date< DATE_SUB(NOW(), INTERVAL 1 MINUTE)

1 分钟后,我正在刷新表格,但数据仍然存在。该事件每 30 秒运行一次,它会删除所有 1 分钟或更长时间的行,不是吗?

使用 phpmyadmin 和 InnoDB 引擎。

编辑 即使我这样做了

CREATE EVENT AutoDeleteRows
ON SCHEDULE EVERY 30 SECOND 
DO 
DELETE LOW_PRIORITY FROM a_database.event_temp_users 
WHERE registration_date< DATE_SUB(NOW(), INTERVAL 1 MINUTE)

还是不行

【问题讨论】:

    标签: php mysql codeigniter phpmyadmin


    【解决方案1】:

    如果你的事件应该每 30 秒运行一次,你必须使用:

    CREATE EVENT AutoDeleteRows
    ON SCHEDULE EVERY 30 SECOND 
    DO 
    DELETE LOW_PRIORITY FROM a_database.event_temp_users 
    WHERE registration_date< DATE_SUB(NOW(), INTERVAL 1 MINUTE)
    

    改为。

    要定期重复操作,请使用 EVERY 子句。

    使用 AT,您的事件只会在这个特定时间点执行一次:

    AT 时间戳用于一次性事件。它指定事件仅在时间戳给定的日期和时间执行一次,时间戳必须包括日期和时间,或者必须是解析为日期时间值的表达式。

    都来自章节CREATE EVENT Syntax

    您必须检查事件调度程序是否正在运行。这可以通过

    SELECT @@event_scheduler;
    

    如果结果应该是 OFF 并且您有权启动事件调度程序,那么您可以使用以下命令激活事件调度程序

    SET GLOBAL event_scheduler = 'ON';
    

    Event Scheduler Configuration

    全局 event_scheduler 系统变量确定是否 事件调度程序已启用并在服务器上运行。它有一个 这 3 个值会影响事件调度,如下所述:

    • OFF:事件调度程序已停止。事件调度程序线程未运行,未显示在 SHOW PROCESSLIST 的输出中,并且未执行任何已调度的事件。 OFF 是 event_scheduler 的默认值。

    当 Event Scheduler 停止时(event_scheduler 为 OFF),可以通过将 event_scheduler 的值设置为 ON 来启动它。 (见下一项。)

    • ON:启动事件调度程序;事件调度线程运行并执行所有已调度的事件。

    • DISABLED:此值使事件调度程序无法运行。当事件调度程序被禁用时,事件调度程序线程不会运行(因此不会出现在 SHOW PROCESSLIST 的输出中)。此外,Event Scheduler 状态不能在运行时更改。

    【讨论】:

    • 但是 CURRENT_TIMESTAMP + INTERVAL 30 SECOND 与 EVERY 30 SECOND 相同,不是吗?
    • 不,不是。这只是在创建事件后 30 秒执行一次。然后再也不会了。
    • 好的,但它甚至没有运行一次,如果它至少运行一次,行将被删除。
    • 您可以验证您的事件,即使用针对 information_schema 的查询:SELECT * from information_schema.events WHERE event_name = 'AutoDeleteRows';。主要兴趣应该是last_executed 列。
    • 可以在mysql客户端执行DELETE语句吗?最后评论查询的event_definitionevent_typeinterval_valueinterval_fieldstatus列的结果是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2019-07-22
    相关资源
    最近更新 更多