【问题标题】:Increment a value for entire database为整个数据库增加一个值
【发布时间】:2011-09-12 18:39:48
【问题描述】:

所以我们有一个数据库。每隔一段时间,我们就会添加一个新的数据集,并且应该删除最旧的数据集。

假设数据库是 6 月初:18 条记录,6 月下旬:15 条记录,8 月:23 条记录。当我们添加下一条记录时,我们想要删除六月初的记录。但是,添加新数据并不完全正常。 我的第二个想法是为每条记录设置一个“旧度”字段,在添加新数据集之前,将所有“旧度”字段增加 1,然后删除所有“旧度”为 3 的数据。

我担心这不是执行此操作的最佳方式,但我不确定这是否重要,因为它是一个不经常更新的相当小的数据库。也就是说,我当然愿意接受更好的算法来实现这一点的建议。

【问题讨论】:

  • 是的,你应该选择不清理,因为它根本不会打扰 mysql
  • 如果您的数据库很小,您不必定期清理旧记录以使其更好地工作
  • 如果我们不删除旧信息,数据库将不会保持小规模。
  • 你能把桌子的大小包括在内吗?因为在你的描述中听起来不到几千

标签: mysql database-management


【解决方案1】:

我假设您的数据已存储为每个报告都有一个时间戳(日期)列,并且您始终希望删除 x(在本例中为 3)个月前的数据。如果是这样,您可能会考虑使用 mysql 的DATEDIFF 函数。

例如,它可能看起来像这样:

DELETE from table1 WHERE datediff(CURRENT_DATE(), datecol) > 89

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

【讨论】:

  • 问题是我不知道最旧的数据会有多长时间。可以跳过几个月,或者一个月可能有 4 次更新。
  • 嗯..您可以使用MIN 函数获取现有记录的最早日期,并使用LAST_DAY 指定该月的最后一天。然后,您将在最旧的使用月份的最后一天获得午夜,因此您需要在其中添加一天,以便删除在最后一天输入的记录。大概是这样的? SET @olddate = (SELECT (LAST_DAY(MIN(datecol) + INTERVAL 1 DAY) from table1); DELETE from table1 WHERE datecol < @olddate
  • 同样,同一个月可以有多个更新,但我认为MIN 是要走的路。找到 MIN 日期,添加一个小时(以防记录没有同时添加)并删除比那个更早的日期。
  • 我认为我有一些工作(感谢您的评论),所以如果您想使用MIN 编辑您的答案(或创建一个新的答案),我会标记它作为接受的答案。
  • 由于我对您发现答案的帮助纯属巧合,如果您发布解决方案并将其标记为已接受的答案,可能会更有用。 :)
【解决方案2】:

总是按月计算吗?

UPDATE table SET status = "oldness" WHERE date_inserted <= NOW() - INTERVAL 3 MONTH

【讨论】:

  • 遗憾的是没有。一个月内可以有多个更新,或者可以完全跳过几个月。
  • 没问题。我发布的这个示例将在 3 个月大的所有行中运行。我的意思是,可能有一组数据可以从一个月中旬开始,到下个月中旬结束?如果是,您可能需要添加一列来区分一组数据。如果不是,我的解决方案将起作用。
【解决方案3】:

在user937146 的帮助下,我想我已经找到了解决方案。基本上

$query = "SELECT MIN(timestamp) FROM new_items WHERE type = 'Book' ";

然后只需获取该时间戳,添加一个小时(因为上传数据可能需要超过一秒,可能一分钟就足够了),然后从数据库中删除早于该时间戳的所有内容。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多