为了说明我的问题,我们以滚动日志文件为例。您可以设置一个以字节为单位的上限,并删除每个上面的字节,以便放置到新条目中。
我的数据库需要类似的东西,我想创建一个每天都会执行的查询。
查询将删除数字N 记录上表格T 中的所有旧记录。
记录将按日期降序排序。
该表中有数百万条记录。
答案 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视为日期的大表。然后,您可以非常轻松地(并且快速地)删除或截断您希望的分区。绝对不是一般的解决方案。