生成序列号而不重复

时间:2011-10-09 12:06:00

标签: sql-server-2008

我需要首次根据某些条件生成唯一的序列号,然后将其存储在DB中,每次我选择此生成的数字加1,直到达到阈值,然后重置生成的数字。

我已经生成了数字并将其存储在DB中,有一个存储过程调用此数字并将其递增1然后使用新值更新存储的值(递增后)。现在的问题是,可能有2个用户同时调用相同的程序,然后每个用户将选择相同的存储生成的数字,然后递增它并用新的更新存储的值(假设按顺序完成更新而没有死锁)并且这种情况下,2个用户获得相同的号码并打破号码规则是唯一的,我如何避免并发用户选择(获取)相同的号码?

注意:生成的数字类型为NVARCHAR(200)

2 个答案:

答案 0 :(得分:0)

您必须将主键的默认值设置为NEWSEQUENTIALID(),将数据类型设置为UNIQUEIDENTIFIER。

答案 1 :(得分:-1)

虽然这是一个主要的黑客行为,但是你可以实现这一点,并且必须有一个更好的方法是使用自动递增键维护另一个表。

然后我可以在程序开始时插入该密钥并返回标识。然后,您可以应用模数逻辑来返回唯一的递增键。

例如,表格为:

CREATE TABLE [dbo].[uniqueidentifier](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [b] [bit] NOT NULL
) ON [PRIMARY]

然后每当您需要下一个键时,请执行以下操作,其中X是您的回收阈值:

declare @rtn int
delete * from uniqueidentifier 
insert into uniqueidentifier values (1)
set @rtn = scope_identity() % X

正如我所说的那样凌乱而且defo是一个hack但是它会工作但是我强烈建议你可以重构创建这个数字的存储过程的逻辑

希望这会有所帮助,或者有更好的建议