代码之家  ›  专栏  ›  技术社区  ›  Kyle Rosendo

确保唯一的价值

  •  0
  • Kyle Rosendo  · 技术社区  · 14 年前

    我有一个包含唯一值的表,调用存储过程后,我在子查询中使用以下代码从表中获取随机值:

    SELECT TOP 1 UniqueID FROM UniqueValues
    WHERE InitiatingID is NULL
    ORDER BY NewID() ASC
    

    然而,我注意到我不时地(并且我猜测两个同时运行的调用会导致它)检索相同的唯一值两次,这会导致程序中出现一些问题。

    是否有任何方法(最好不要锁定表)使唯一值ID生成完全唯一,或使唯一值足以不影响两个同时调用?注意,我需要保留唯一的值,不能直接在这里使用guid。

    谢谢,

    凯尔


    编辑以便澄清:

    我正在缓冲唯一的值。就是这样 WHERE InitiatingID is NULL 都是关于。当从查询中挑选出一个值时,会设置initiatingID,因此在释放之前不能再次使用。问题是,在该进程的毫秒内,设置 InitiatingID 似乎价值又被重新拾起,从而损害了整个过程。

    3 回复  |  直到 13 年前
        1
  •  1
  •   Tim Cooper    13 年前

    随机意味着您将随机获得相同的值两次。

    为什么不使用标识列?

    几天前我写了一篇关于手动生成ID的博客 here . 也许这有帮助。

        2
  •  0
  •   Tobiasopdenbrouw    14 年前

    您所做的并不是真正生成随机的唯一值——如果使用适当的例程,则生成重复值的概率很低,而是从总体中随机选择一个项目——根据总体的大小,重复出现的概率要高得多。事实上,如果重复画的次数足够多,偶尔会有重复——如果没有,就不会是真正随机的。

    如果您不想在一行中绘制相同的唯一ID,您可以考虑在某个地方缓冲“旧”唯一ID,如果匹配则放弃绘制(或运行 WHERE <> currentlydrawuniqueID )

        3
  •  0
  •   Shannon Severance    14 年前

    用什么呢 update output 选择的子句 UniqueId 并设置 InitiatingId 一下子。 http://msdn.microsoft.com/en-US/library/ms177564(v=SQL.90).aspx

    比如:(虽然我手头上没有SQL Server,所以没有测试过。)

    DECLARE @UniqueIDTable TABLE
    (
        UniqueId int
    )
    
    
    UPDATE UniqueValues
    SET InitiatingID = @InitiatingID
    OUTPUT INSERTED.UniqueId into @UniqueIDTable
    WHERE UniqueID = 
        (SELECT TOP 1 UniqueID FROM UniqueValues 
        WHERE InitiatingID is NULL 
        ORDER BY NewID() ASC)
    AND InitiatingID is NULL