在 MSSQL Server 2005 上有一个 2 列的小表,其中包含大量信息,比如说大约 10 亿条记录,并且不断被写入。
表的定义是:
Create table Test(
id int identity(1,1) primary key ,
name varchar(30) )
Te PK 是 int,出于多种原因,我选择它而不是 uniqueidentifier。问题来自自动增量,我想在每次删除一行时重新组织“id”。这样做的目的是不留空隙。该表处于活动状态,并且向其中写入了很多行,因此删除一列不是一个选项,也会长时间锁定该表。
我想要完成的快速示例:
我有这个 :
id | name
----+-------
1 | Roy
2 | Boss
5 | Jane
7 | Janet
我想重新组织它,使它看起来像这样:
id | name
----+-------
1 | Roy
2 | Boss
3 | Jane
4 | Janet
我知道 DBCC CHECKIDENT (TableName, RESEED, position) 但我不确定它是否会对我的情况有利,因为我的表很大,如果我没记错的话,重新定位也需要很长时间,它会锁定表很长一段时间。该表不被任何其他表使用。但是,如果您愿意,您可以针对相同的问题提交建议,同时记住该表已被其他表使用。
编辑 1:
目的是证明在删除行的情况下各行相互跟随,以便我可以看到它已被删除并恢复它。我正在考虑添加第三列,该列将包含上面行的哈希值,如果上面的行被删除了我会知道我有一个差距并且需要恢复它,在这种情况下顺序无关紧要,因为我可以比较has代码并查看它们是否匹配,所以我可以看到哪一行跟随哪一行。但仍然我想知道有没有更聪明、更安全的方法呢?也许涉及其他东西而不是哈希码,其他证明行相互跟随的方法,或者新行包含前一行的部分?
编辑 2:
如果我不能很好,我会尝试再解释一次,然后我不想浪费任何人的时间。
在完美的情况下,该表不会丢失任何内容,但由于服务器错误,某些数据可能会被删除,或者我的一些同事可能会浪费并因错误而将其删除。
我有日志并且可以恢复该数据,但我想证明这些记录是有序的,即使出现服务器错误并且它们中的一些被删除但后来又恢复了,它们也会相互跟随。有没有办法做到这一点 ?
示例:假设 7 被删除,然后恢复为 23 ,您将如何证明 23 是 7 ,这意味着 23 出现在 6 之后和 8 之前?