我将如何重置表的所有标识值,并在 Sql Server 2008 中重新设置自动编号

Mra*_*anz 2 sql-server-2008 sql-server identity ddl

我有一个客户在数据库中有一个带有自动编号 ID 字段的表。客户使用该 ID 作为存储在数据库中的唯一记录的用户友好标识符。一段时间后,我的应用程序将删除数据库中的旧记录,这样在任何给定时间通常会有大约 30k 条记录的滑动窗口。

这个功能很好,已经工作了几年,但现在数据库中的id已经上亿了,客户现在很难将故障id传达给外界。

他们想要做的,以及我希望找出如何做的,是将当前表中的所有记录,并将它们的 id 减少到从 1 开始,然后重新设定身份以开始计算新表的位置id 会。

在数学中:新 id = 当前 id - min(ID)

然后最后:新种子 = max(id)

谢谢

编辑

为了帮助澄清一件事,记录会定期从数据库中删除,因此开始:

1-30k 有效记录

5个月后:

1-2mil - 无记录 2mil - 2mil + 30k - 有效记录

用户本质上想要做的是从所有 id(仍然是唯一的)中减去 2mil,并假装以前的记录根本不存在。

Aar*_*and 5

最简单的方法是创建一个新表。注入要保留的 30,000 行,然后删除旧表并重命名新表。

BEGIN TRANSACTION;

CREATE TABLE dbo.copy_of_foo
(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  col2 ..., ...
);

INSERT dbo.copy_of_foo(col2, ...) 
  SELECT TOP 30000 col2, ...
  FROM dbo.foo
  ORDER BY ...;

DROP TABLE dbo.foo;

EXEC sp_rename N'dbo.copy_of_foo', N'foo', N'OBJECT';

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

OPTION (MAXDOP 1)如果您想确保获得 30K 最近的行并且 IDENTITY 值按从旧到新的顺序分配,您可能需要嵌套 order by 并添加,例如希望您有一些其他列,例如日期时间列,这可以帮助确定您要保留的 30000 行:

INSERT dbo.copy_of_foo(col2, ...)
  SELECT col2, ...
  FROM 
  (
    SELECT TOP 30000 col2, ...
      FROM dbo.foo 
      ORDER BY date_time_column DESC
  ) AS x
  ORDER BY date_time_column
  OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

但请记住,如果昨天有人报告了第 #42,000,564 行的异常,那么祝您今天能找到它。正如我在评论中所建议的那样,也许您不应该向用户公开这些明显——否则——绝对——毫无意义的代理标识符。