mysql - 如何从数据库中循环删除条目?

标签 mysql database stored-procedures relational-database

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

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

最佳答案

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 代码中。在将查询放入事件之前,请先调试查询,因为调试事件很困难。

关于mysql - 如何从数据库中循环删除条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415357/

相关文章:

php - 如果我从 MySQL 中提取数据,是否必须使用 PHP 编写 HTML?

mysql - 相同的查询超时 - 查询期间与 MySQL 服务器失去连接

sql - 将事务存储到 NoSQL 数据库中

mysql - 使用 ColdFusion 9 的 <CFQUERY>-Tag 在 MySQL5 中创建存储过程

mysql - 我们可以多次使用单个光标而不再次打开它吗?

mySQL转储不一致

mysql - 根据时间戳列选择不同的最新 2 行

sql - 这将如何影响使用带有回滚事务的循环的数据

PHP MySQL 插入语句不会将数据插入我的数据库

python couchdb 版本冲突