我应该如何将表限制为 N 行,丢弃最旧的?

Mat*_*hew 2 trigger sql-server-2008-r2

我有一个用于存储事件的 SQL Server 表。

我只希望表包含最近添加的 1000 行,当插入第 1001 行时,应删除第 1 行。

我有一个 DateCreatedUTC 列和一个自动编号列......我可以编写一个查询来执行删除并触发它,INSERT但我不知道这是最合适的解决方案。

Aar*_*and 9

您可以创建一个视图以在其余行确实存在时隐藏它们:

CREATE VIEW dbo.Top1000Rows
AS
  SELECT TOP (1000) ...columns...
    FROM dbo.table_name
    ORDER BY DateCreatedUTC DESC;
GO
Run Code Online (Sandbox Code Playgroud)

然后在后台作业中定期运行它(只需使用频率,直到您对表本身“关闭”的频率和数量感到满意为止):

;WITH x AS 
(
  SELECT pk_column, 
    rn = ROW_NUMBER() OVER (ORDER BY DateCreatedUTC DESC)
  FROM dbo.table_name
)
DELETE x WHERE rn > 1000;
Run Code Online (Sandbox Code Playgroud)

如果它不必一直都是 1,000 行,那么您可能会完全忘记视图,因为知道有时会超过 1,000 行。

  • @Matthew 不,没有内置任何东西,这似乎是一个特殊的要求。我不确定 SQL Server 代理历史记录是如何实现 FIFO 的,但对于用户数据,我不确定这是一个常见的用例。 (3认同)