当前位置: 首页 > 面试题库 >

如何在MySQL中定期归档数据

刘和玉
2023-03-14
问题内容

我有这种情况:

我在表中有2个特定的列,分别称为cs_start_time(Type:Datetime)cs_time_length(Type:int (seconds))

现在,我想在何时自动删除这些行cs_start_time + cs_time_length < NOW() (Current Datetime)并将其插入到另一个表中(当然应该在删除这些行之前)。

或者,当有人在这些行上执行选择查询时,我会进行处理(触发类似)

使用mysql甚至可能吗?(我是mysql的新手)


问题答案:

您可以MySQL event scheduler用于此目的:

我已经模拟了您的方案,该方案创建了最初保留数据的主表。之后,过期的数据将存储在archiveTable通过命名的表中event scheduler

  • 主表结构和数据:
-- ----------------------------
-- Table structure for `maintable`
-- ----------------------------
DROP TABLE IF EXISTS `maintable`;
CREATE TABLE `maintable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cs_start_time` datetime NOT NULL,
  `cs_time_length` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

-- ----------------------------
-- Records of maintable
-- ----------------------------
INSERT INTO `maintable` VALUES ('1', '2016-05-01 12:00:00', '10');
INSERT INTO `maintable` VALUES ('2', '2016-05-02 12:00:00', '5');
INSERT INTO `maintable` VALUES ('3', '2016-05-03 12:00:00', '15');
  • 存档表的结构和数据:
DROP TABLE IF EXISTS `archivetable`;
CREATE TABLE `archivetable` (
  `id` int(11) NOT NULL,
  `cs_start_time` datetime NOT NULL,
  `cs_time_length` int(11) NOT NULL
);
  • 首先将事件调度程序设置为开启

SET GLOBAL event_scheduler = ON;

  • 创建事件:
    DROP EVENT IF EXISTS `archiveEvent`;
    delimiter $$
    CREATE EVENT `archiveEvent` ON SCHEDULE EVERY 1 MINUTE STARTS '2016-05-02 00:00:00' ON COMPLETION PRESERVE ENABLE DO

    BEGIN
        INSERT INTO archivetable (
            id,
            cs_start_time,
            cs_time_length
        ) SELECT
            MT.id,
            MT.cs_start_time,
            MT.cs_time_length
        FROM
            maintable MT
        WHERE
            MT.cs_start_time + INTERVAL MT.cs_time_length SECOND < NOW() ;

        DELETE
        FROM
            maintable
        WHERE
            cs_start_time + INTERVAL cs_time_length SECOND < NOW() ;
        END$$

    delimiter ;

注意: 事件开始时间设置为2016-05-02 00:00:00。之后,将每隔一分钟安排一次活动。您可以根据需要以任何间隔单位更改计划时间。

建议:

引用我的评论:

您可以为此目的使用mysql事件调度程序。但我建议您可以在选择查询中过滤掉这些条目。删除这些条目有什么大不了的,而您可以轻松地在选择查询中跳过这些条目?您必须通过调度程序每秒检查一次它们是否满足要删除的条件;



 类似资料:
  • 问题内容: 我有一堂课 我想序列化并保存为用户默认值。 首先,我不确定如何正确编写编码器和解码器。因此,对于初始化,我编写了两种方法。 当我尝试执行此代码时: 应用程序崩溃,我收到此消息: 我做错了什么? 问题答案: 仅适用于Objective- C类,不适用于纯Swift类。您可以通过使用属性标记类或从诸如的Objective-C类继承来将类桥接到Objective-C 。 有关更多信息,请参见

  • 问题内容: 如何在MySql中运行此查询? 它会显示如下错误消息: 问题答案: 该语句/方法适用于PostgreSQL和Sybase(我想可能还有更多),所以也许您可以看一下: http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html 它应该向您展示一些使用MySQL的方法(以及PHP中的一两个方法,我只知道它不在您的标签列

  • 问题内容: 很简单的问题。 我有一个很大的70gb数据库,其中有五个表中的四个,每个表包含约5000万行。这些表包含大约6年的数据。我们将数据库的空间大小限制为80gb,并且在接下来的6个月左右的时间内我们将迅速接近该空间。 我们只需要在实时数据库中保留大约两年的数据价值。在不使实时数据库(24/7数据库)脱机的情况下,归档较旧数据的最佳方法是什么? 我们正在使用共享存储的主动-被动设置在群集环境

  • 我只想从使用Log4j(v2.8.2)的Java移植以下代码: 问题在于newBuilder()方法,该方法在log4j中定义为某种递归泛型: Java代码会自动推断泛型参数,而Kotlin的情况并非如此。在Kotlin中调用此方法有什么解决方案吗? 我在Kotlin尝试的代码: 它有以下错误: 错误:(90,48)静态编程语言:类型推断失败:没有足够的信息来推断参数B的乐趣! 当代码在粘贴时自动

  • 问题内容: 如何在MySQL中的日期之间取平均值?我对时间值,小时和分钟更感兴趣。 在具有以下内容的桌子上: 进行如下查询: 编辑: 的作品,但我不知道它是什么返回数据。 问题答案: 这似乎有点骇人听闻,但适用于1970年〜1970年和2030年之间的日期(在32位元弓上)。您实际上是在将日期时间值转换为整数,对其求平均,然后将平均值转换回日期时间值。 可能有更好的解决方案,但这会帮助您紧要关头。

  • 注意:在MySQL表中,此列的数据类型我选择了日期数据类型 我只是有问题的日期部分查询插入日期: