如何清除某个数字以上的表的所有记录以进行清理

时间:2011-10-14 08:25:42

标签: mysql sql sql-server oracle

为了说明我的问题,我们以滚动日志文件为例。您可以设置一个以字节为单位的上限,并删除每个上面的字节,以便放置到新条目中。

我的数据库需要类似的东西,我想创建一个每天都会执行的查询。

查询将删除数字N 记录上表格T 中的所有旧记录。

记录将按日期降序排序。

该表中有数百万条记录。

6 个答案:

答案 0 :(得分:3)

如果ID是T的主键:

delete T where ID not in (select top N ID from T order by date_column desc)

答案 1 :(得分:2)

这样的事情应该有效。

DELETE FROM <table> WHERE date < (
 SELECT min(date) FROM (
   SELECT date FROM table
   ORDER BY date DESC
   LIMIT N
 )
)

内部选择查找前N个较新的记录。 然后中间选择找到那些的旧日期,外部选择删除比这更早的所有内容。

答案 2 :(得分:2)

您没有指定RDBMS。对于SQL Server

WITH CTE AS
(
SELECT ROW_NUMBER() OVER (ORDER BY Dt DESC) AS Rn
FROM T
)
DELETE FROM CTE
WHERE Rn > 100000

答案 3 :(得分:1)

如果我理解你的问题,你需要像

这样的东西
DELETE FROM T WHERE ID IN (SELECT TOP 1000 ID FROM T AS T1 WHERE T1.DATE > @DATE )

在此示例中,N = 1000,最小日期为@DATE

答案 4 :(得分:1)

对于ORACLE

delete from T 
where rowid not in ( select rowid 
                     from (select rowid from T order by date desc)
                     where rownum <= N
                    )

答案 5 :(得分:1)

对于Oracle(企业),您可以将范围partitioning视为日期的大表。然后,您可以非常轻松地(并且快速地)删除或截断您希望的分区。绝对不是一般的解决方案。