【问题标题】:How can I cyclically remove entries from my database?如何从我的数据库中循环删除条目?
【发布时间】:2015-05-23 17:01:13
【问题描述】:

我有一个表用于存储一些带有日期的条目,我将其放入“日期时间”类型的字段中。 我想当时自动将这些条目移动到另一个表中。 结果将是一个包含所有已通过条目的表格,以及一个包含未来条目的表格。

我正在考虑使用存储过程,但我不知道如何在需要时触发它们。 或者,也许我需要一个始终在我的服务器上运行的独立应用程序。 或者也许我只是没有想到正确的、平庸的解决方案......

【问题讨论】:

    标签: mysql database stored-procedures relational-database


    【解决方案1】:

    MySQL 提供事件,它们类似于存储过程,但也可以在特定时间或特定计划运行。

    执行您想要的查询的基本序列是这样的。

    START TRANSACTION;
    SET @time := NOW() - INTERVAL 24 HOUR;
    INSERT INTO archive_log
    SELECT * 
      FROM live_log
     WHERE  timestamp <= @time;
    DELETE FROM live_log WHERE timestamp <= @time;
    COMMIT;
    

    您可以根据需要经常运行它。每次运行它时,您都会将旧记录从live_log 表移动到archive_log 表。短语- INTERVAL 24 HOUR 控制记录必须有多旧才能移动它们。

    您可以将其作为 MySQL 事件运行。为此,必须在您的 MySQL 服务器中启用事件调度。读这个。 https://dev.mysql.com/doc/refman/5.6/en/events-configuration.html

    这是您声明此事件的方式。

    CREATE EVENT `archiver` 
        ON SCHEDULE EVERY 4 HOUR
        STARTS '2015-05-23 15:11:23'
        ON COMPLETION PRESERVE DO 
    BEGIN
        START TRANSACTION;
        SET @time := NOW() - INTERVAL 24 HOUR;
        INSERT INTO archive_log
        SELECT * 
          FROM live_log
         WHERE  timestamp <= @time;
        DELETE FROM live_log WHERE timestamp <= @time;
        COMMIT;
    END
    

    请注意,查询嵌入在CREATE EVENT 代码中。首先调试查询,然后再将其放入事件中,因为调试事件很难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2023-03-26
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多