代码之家  ›  专栏  ›  技术社区  ›  Josh

为表的每条记录创建唯一的id(PIN)

  •  4
  • Josh  · 技术社区  · 14 年前

    理想情况下,我希望能够在SQLServer中创建这个,但如果需要的话,我可以通过ASP.Net来实现。

    抱歉,如果我不清楚:我不是在寻找一个GUID,因为我需要的是一个唯一的id表;我只是不希望它是增量的。

    6 回复  |  直到 12 年前
        1
  •  4
  •   mdma    14 年前

    添加 uniqueidentifier

    CREATE TABLE MyTable (
       ...
       PIN uniqueidentifier NOT NULL DEFAULT newid()
       ...
    )
    

    uniqueidentifier保证是唯一的,不仅对于这个表,而且对于所有的表。

       SELECT RIGHT(REPLACE((SELECT PIN from MyTable WHERE UserID=...), '-', ''), 4/*PinLength*/)
    

    请注意,返回的较小PIN不能保证对所有用户都是唯一的,但可能更易于管理,具体取决于您的应用程序。

    Coupon Collector's 问题,并接近n logn复杂度,这将导致非常慢的插入(插入时间与现有元素的数量成比例,因此插入M个项将变成O(n^2))。避免这种情况的最简单方法是使用一个大的唯一ID,并仅为您的PIN选择其中的一部分,假设您可以放弃PIN值的唯一性。

    编辑2:

    如果有这样的表定义

    CREATE TABLE YourTable (
        [id] [int] IDENTITY(1,1) NOT NULL,
        [pin]  AS (CONVERT(varchar(9),id,0)+RIGHT(pinseed,3)) PERSISTED,
        [pinseed] [uniqueidentifier] NOT NULL
    )
    

    这将创建 pin pinseed

    只是说,我建议你不要认为这是安全的。你应该考虑到其他用户总是有可能猜到其他人的PIN,除非你以某种方式限制了允许的猜测次数(例如,尝试3次后停止接受请求,类似于银行在3次PIN输入不正确后将你的卡封存。)

        2
  •  1
  •   smdrager    14 年前

    你想要的是一个GUID

    http://en.wikipedia.org/wiki/Globally_unique_identifier

    大多数语言都有一些API来生成这个。。。谷歌搜索会有所帮助;)

        3
  •  0
  •   TimS    14 年前

    一个默认值为NEWID()的UNIQUEIDENTIFIER类型列怎么样?

        4
  •  0
  •   João Pinto    14 年前

    请记住,通过要求一个唯一的PIN(这是不常见的),您将限制允许的最大用户数的PIN规范。你确定要这个吗?

        5
  •  0
  •   bobs    14 年前

    SELECT CAST(ABS(CHECKSUM(NEWID()))%2000000000+1 as BIGINT) as [PIN]
    

    这就产生了一个介于10亿到20亿之间的数字。您将模拟某种程度的随机性,因为它是从NEWID函数派生的。也可以根据需要格式化结果。

    这并不能保证唯一性。我建议您对PIN列使用唯一的约束。而且,创建新PIN的代码应该在赋值之前检查新值是否唯一。

        6
  •  0
  •   Darryl Peterson    14 年前

    使用随机数。

    表中的值越稀疏,效果就越好。如果赋值的数目与可用值的数目成正比,那么它就不起作用了。

    一旦生成了数字,您就有了几个选项。 2) 生成值并查找最大和最小现有唯一标识符。

    DECLARE
        @uid    INTEGER
    SET @uid = ROUND(RAND() * 10000, 1)
    SELECT @uid
    SELECT MAX(uid) FROM table1 WHERE uid < @uid
    SELECT MIN(uid) FROM table1 WHERE uid > @uid