【问题标题】:Sql Server Column with Auto-Generated Data具有自动生成数据的 Sql Server 列
【发布时间】:2010-10-18 20:16:16
【问题描述】:

我有一个客户表,我的要求是添加一个新的 varchar 列,该列在每次创建新客户时自动获取一个随机唯一值。

我想写一个随机化字符串的SP,然后检查并重新生成字符串是否已经存在。但是要将 SP 集成到客户记录创建过程中,需要在代码级别使用事务性 SQL 内容,我想避免这种情况。

请帮忙?

编辑: 我应该强调一下,varchar 必须是 5 个字符长,数值在 1000 到 99999 之间,如果数字小于 10000,则在左侧填充 0。

【问题讨论】:

    标签: sql-server auto-generate


    【解决方案1】:

    随机字符串数据是否需要一定的格式?如果不是,为什么不使用唯一标识符?

    insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())
    

    或者使用NEWID()作为列的默认值。

    编辑: 我同意@rm,在您的数据库中使用数值,并在代码中处理转换为字符串(使用填充等)。

    【讨论】:

    • 我应该强调一下,varchar 必须是 5 个字符长,数值在 1000 到 99999 之间,如果数字小于 10000,则在左侧填充 0。
    【解决方案2】:

    我认为 Michael 对自动增量的回答应该很有效 - 您的客户将获得“01000”,然后是“01001”,然后是“01002”,依此类推。

    如果您想或必须使其更加随机,在这种情况下,我建议您创建一个包含所有可能值的表,从“01000”到“99999”。当您插入一个新客户时,使用一种技术(例如随机化)从该表(您仍然可用的客户 ID 池)中选择一个现有行,然后使用它,然后将其从表中删除。

    随着时间的推移,其他任何事情都会变得非常糟糕。想象一下,您已经使用了 90% 或 95% 的可用客户 ID - 尝试随机找到剩余的少数可能性之一可能会导致几乎无休止地重试“这个被占用了吗?是的 -> 尝试下一个”。

    马克

    【讨论】:

      【解决方案3】:

      通过您的编辑/更新,听起来您需要的是自动增量和一些填充。

      下面是一种使用假表的方法,然后添加从 1000 开始的 IDENTITY 列(假设您没有),然后使用计算列为您提供一些填充以使一切正常按照你的要求。

      CREATE TABLE Customers (
          CustomerName varchar(20) NOT NULL
      )
      GO
      
      INSERT INTO Customers 
      SELECT 'Bob Thomas' UNION
      SELECT 'Dave Winchel' UNION
      SELECT 'Nancy Davolio' UNION
      SELECT 'Saded Khan'
      GO
      
      ALTER TABLE Customers
          ADD CustomerId int IDENTITY(1000,1) NOT NULL
      GO 
      
      ALTER TABLE Customers
          ADD SuperId AS right(replicate('0',5)+ CAST(CustomerId as varchar(5)),5) 
      GO
      
      SELECT * FROM Customers
      GO
      
      DROP TABLE Customers
      GO
      

      【讨论】:

        【解决方案4】:

        当用户不告诉我他们想要做什么,或者为什么,他们只想告诉我怎么做时,这个问题给我的感觉是一样的。

        “随机”和“唯一”是相互冲突的要求,除非您创建一个序列列表,然后从中随机选择,删除选择的值。

        但这要解决的问题是什么?

        【讨论】:

          【解决方案5】:

          如果必须是 varchar,您可以将 uniqueidentifier 强制转换为 varchar。

          要获得随机唯一标识符,请执行NewId()

          这是你的施法方式:

          CAST(NewId() as varchar(36))
          

          编辑

          根据您对@Brannon 的评论:

          您是说您的表中永远不会有超过 99k 条记录?如果是这样,只需将您的 PK 设置为标识列,使用 1000 为其播种,并在您的业务逻辑中处理“0”左填充。

          【讨论】:

            【解决方案6】:

            试试这个:

            ALTER TABLE Customer ADD AVarcharColumn varchar(50) 
            CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)
            

            它返回最多毫秒的日期和时间,这在大多数情况下就足够了。

            真的需要一个独特的价值吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-02
              • 1970-01-01
              • 2018-05-19
              • 2017-03-03
              • 1970-01-01
              • 2011-12-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多