在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)但是我不确定它会对我的情况有什么好处,因为我的表很大,如果我没有弄错的话也需要花很多时间重新定位把桌子锁了很长时间。任何其他表都不使用此表。但是,如果您愿意,可以提交一个针对同一问题的建议,同时考虑到其他表使用该表。
目标是证明行在行被删除的情况下相互跟随,所以我可以看到它被删除并恢复它。我正在考虑添加第三列,其中包含上面一行的哈希值,如果上面的行被删除,我会知道我有一个间隙并需要恢复它,在这种情况下,顺序无关紧要,因为我可以比较有代码并查看它们是否匹配,所以我可以看到哪一行跟随哪一行但是我仍然想知道是否有一种更聪明,更安全的方法呢?可能还有其他东西而不是哈希码,还有其他证明行相互跟随的方式,或者新行包含前一行的部分?
如果我不能好的话,我会再次解释它,然后我不想浪费任何人的时间。
在完美的案例场景中,此表中没有任何遗漏,但由于 服务器错误某些数据可能被删除或者我的一些同事可能会浪费并且因故障而删除它 我有日志并可以恢复该数据,但我想证明记录是按顺序进行排序的 即使存在服务器错误,其中一些被删除但后来又恢复了。 有没有办法做到这一点?
实施例: 好吧,让我们说7被删除,之后恢复为23,你怎么能证明23是7,这意味着23在6之后和8之前出现?
答案 0 :(得分:5)
我建议不要担心尝试重新设置Identity
列 - 让SQL Server保持每行的唯一性。
通常这需要表示逻辑,在这种情况下,您可以使用ROW_NUMBER()
分析函数:
SELECT Row_Number() Over (Order By Id) NewId,
Id, Name
FROM YourTable
答案 1 :(得分:0)
我同意其他人的意见,通常不应该这样做,但是如果你绝对想要这样做,你可以利用古怪的更新来快速完成它,应该是这样的:
DECLARE @prev_id INT = 0
UPDATE Test
SELECT id = CASE WHEN id - @prev_id = 1 THEN id
ELSE @prev_id + 1
END
,@prev_id = id
FROM test
您应该了解古怪更新的局限性,主要是确保输出一致必须满足的条件。这是一篇很好的文章但他们烦人地让你登录,但你可以找到其他资源:http://www.sqlservercentral.com/articles/T-SQL/68467/
编辑:实际上,在这种情况下,我认为你可以使用:
DECLARE @prev_id INT = 0
UPDATE Test
SELECT id = @prev_id + 1
,@prev_id = id
FROM Test
答案 2 :(得分:0)
执行此操作的方法是不实施建议的修复程序。
单独留下身份。
如果删除了身份7,您就会知道它刚好在6之后,就在8之前。
如果你需要他们保持相同的顺序,那么简单 在名称上放置唯一约束 请勿删除记录 只需为活动添加一个bool列。