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)但是我不确定它会对我的情况有什么好处,因为我的表很大,如果我没有弄错它会锁定表,这将需要很多时间重新定位很长一段时间 任何其他表都不使用此表.但是,如果您愿意,可以提交一个相同问题的建议,同时考虑到其他表使用该表.
目的是证明行被删除以防行删除,所以我可以看到它被删除并恢复它.我正在考虑添加第三列,它将包含上面一行的哈希值,如果上面的行被删除我知道我有一个差距,需要恢复它,在这种情况下顺序无关紧要,因为我可以比较有代码,看看它们是否匹配,所以我可以看到哪一行跟随哪个.但仍然我想知道是否有一种更聪明,更安全的方法呢?可能还有其他东西而不是哈希代码,其他一些证明行相互跟随的方式,或新行包含前一行的部分?
如果我不能好的话,我会再次解释它,然后我不想浪费任何人的时间.
在完美的情况下,此表中不会遗漏任何内容,但由于服务器错误,某些数据可能会被删除,或者我的一些同事可能会浪费并将其删除.
我有日志并且可以恢复该数据,但是我想证明记录是按顺序排列的,即使存在服务器错误它们也会相互关联,其中一些被删除但后来又恢复了.有没有办法做到这一点 ?
例如:好吧,假设7被删除,之后恢复为23,你怎么能证明23是7,这意味着23来自6和8之前?
我建议不要担心尝试重新设置Identity列 - 让SQL Server保持每行的唯一性.
通常这需要表示逻辑,在这种情况下,您可以使用ROW_NUMBER()分析函数:
SELECT Row_Number() Over (Order By Id) NewId,
Id, Name
FROM YourTable
Run Code Online (Sandbox Code Playgroud)