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,并假装以前的记录根本不存在。
最简单的方法是创建一个新表。注入要保留的 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 行的异常,那么祝您今天能找到它。正如我在评论中所建议的那样,也许您不应该向用户公开这些明显——否则——绝对——毫无意义的代理标识符。
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |