【问题标题】:Delete oldest records from database从数据库中删除最旧的记录
【发布时间】:2010-09-08 11:13:07
【问题描述】:

我有一个包含 1000 条记录的数据库。 我正在尝试创建一条 SQL 语句,因此如果记录数超过 1000,则最旧的记录将被删除(即 1000 以上的新记录“替换”最旧的记录)。 我正在使用 SQLite,但我认为通常的 SQL 语法适合这里。

【问题讨论】:

  • 如果您包含一些表架构详细信息,您可能会得到更多答案。
  • 您可能需要提供更多信息。就像你在列上有时间戳吗? id 是 GUID 还是自动增量?您删除所有旧于 X 日期的目标是什么,或者是否有 1000 条记录的限制?或者删除这些记录的原因是什么?那么我们可以更好地回答您的问题。
  • 哦,你的主键字段是什么?或者你有吗?

标签: sql sqlite


【解决方案1】:

如果您使用自动增量字段,您可以轻松编写以下代码来删除最旧的 100 条记录:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable ORDER BY id ASC LIMIT 100)

或者,如果不存在这样的字段,请使用ROWID

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID ASC LIMIT 100)

或者,只留下最新的 1000 条记录:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID DESC LIMIT -1 OFFSET 1000)

【讨论】:

  • 谢谢,但我需要一个 ...limit -1 offset 1000
  • 我也在考虑使用这个,但是 MySQL 最终不会使用以前删除的 ID,所以这不再起作用了吗?由于 ID=1 将可用,将创建一个 ID=1 的新行,然后将首先删除..?
  • 没有。 sql 只是简单地记录了表中使用的最高索引并在其中添加了一个。
  • 当最高索引从 0 重新开始时,会不会出现溢出?
  • 对于上下文,这是一个 SQLite 问题。 SQLite rowid 在创建新行时应该始终使用比当前存在的 rowid 更高的数字。如果您使用AUTO INCREMENT,您将获得比以前使用的更高数字的更强属性。对于这里描述的场景,rowid 属性应该足够了,但是我描述的 rowid 行为并不能保证,它只是当前的行为。
【解决方案2】:

假设您的表有一个主键和一个带有时间戳的列,该时间戳指示插入记录的时间),您可以使用以下行的查询

delete from tableToDeleteFrom
where tablePK in 
(select tablePK 
from tableToDeleteFrom
where someThresholdDate <= @someThresholdDate)

【讨论】:

    【解决方案3】:

    对于删除除第一条记录(最小/最大 id)之外的所有记录,您可以使用:

    SET @ls AS INT
    
    SELECT @ls = MIN(id) FROM DATA
    
    DELETE FROM DATA WHERE id <> @ls
    

    【讨论】:

    • 真的能回答问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多