T-SQL(MSSQL 2005)重新排序Scope_identity

use*_*961 2 sql t-sql sql-server sql-server-2005

在MSSQL Server 2005上有一个包含2列的小表,其中包含大量信息,比如大约10亿条记录,并且不断被写入.

表的定义是:

Create table Test(
id int identity(1,1) primary key ,
name varchar(30) )
Run Code Online (Sandbox Code Playgroud)

Te PK是int,我在uniqueidentifier上选择它有很多原因.我想在每次删除行时重新组织'id'的自动增量问题.这样做的目的是不留空隙.该表处于活动状态,并且会在其中写入大量行,因此删除列也不是一种长期锁定表的选项.

我想要完成的快速示例:

我有这个 :

id  | name
----+-------
 1  | Roy 
 2  | Boss 
 5  | Jane 
 7  | Janet
Run Code Online (Sandbox Code Playgroud)

我想重新组织它,所以它看起来像这样:

id  | name
----+-------
 1  | Roy
 2  | Boss
 3  | Jane
 4  | Janet
Run Code Online (Sandbox Code Playgroud)

我知道DBCC CHECKIDENT(TableName,RESEED,position)但是我不确定它会对我的情况有什么好处,因为我的表很大,如果我没有弄错它会锁定表,这将需要很多时间重新定位很长一段时间 任何其他表都不使用此表.但是,如果您愿意,可以提交一个相同问题的建议,同时考虑到其他表使用该表.

编辑1:

目的是证明行被删除以防行删除,所以我可以看到它被删除并恢复它.我正在考虑添加第三列,它将包含上面一行的哈希值,如果上面的行被删除我知道我有一个差距,需要恢复它,在这种情况下顺序无关紧要,因为我可以比较有代码,看看它们是否匹配,所以我可以看到哪一行跟随哪个.但仍然我想知道是否有一种更聪明,更安全的方法呢?可能还有其他东西而不是哈希代码,其他一些证明行相互跟随的方式,或新行包含前一行的部分?

编辑2:

如果我不能好的话,我会再次解释它,然后我不想浪费任何人的时间.

在完美的情况下,此表中不会遗漏任何内容,但由于服务器错误,某些数据可能会被删除,或者我的一些同事可能会浪费并将其删除.
我有日志并且可以恢复该数据,但是我想证明记录是按顺序排列的,即使存在服务器错误它们也会相互关联,其中一些被删除但后来又恢复了.有没有办法做到这一点 ?

例如:好吧,假设7被删除,之后恢复为23,你怎么能证明23是7,这意味着23来自6和8之前?

sge*_*des 5

我建议不要担心尝试重新设置Identity列 - 让SQL Server保持每行的唯一性.

通常这需要表示逻辑,在这种情况下,您可以使用ROW_NUMBER()分析函数:

SELECT Row_Number() Over (Order By Id) NewId,
  Id, Name
FROM YourTable
Run Code Online (Sandbox Code Playgroud)