update语句中的Auto Increment导致大表上的重复值

时间:2015-05-14 18:45:46

标签: sql-server tsql sql-server-2012

我需要使用You've Been Haacked blog post中的以下代码对表中的行重新编号:

DECLARE @counter int
SET @counter = 0
UPDATE #myTable
SET @counter = ID = @counter + 1

这可以很好地使用几个记录到几千个,但是当我在具有250K +记录的表上的SQL Server 2012(64位)实例上运行它时,我最终得到了许多重复项(ID#1出现了12次) )。总之,大约有27K条记录具有重复值。奇怪的是,大约19K有正好12个欺骗(我的机器上有相同数量的处理器)。

重复的原因是什么?

1 个答案:

答案 0 :(得分:5)

这并不能保证能有效,我确信Phil Haack会打电话给我。扔掉这段代码。

可能的原因是并行性。该变量可能会在多个线程上受到重创。

  

奇怪的是,大约19K有正好12个欺骗(我的机器上有相同数量的处理器)。

这符合解释。

使用ROW_NUMBER生成良好的保证工作ID:

update t
set ID = r
from (
 select *, row_number() over (order by something) r from T
) t

同样简单但理智。