【问题标题】:Autoincrement uniqueidentifier自增唯一标识符
【发布时间】:2011-02-19 17:19:19
【问题描述】:

基本上我想以与身份类似的方式使用 uniqueidentifier。我不想在其中插入值,它应该只是自动插入值,每行的值不同。 我无法在 uniqueidentifier 类型的列上设置自动增量(属性 'autoincrement' 设置为 false 并且不可编辑)。

【问题讨论】:

    标签: sql-server database uniqueidentifier auto-increment


    【解决方案1】:

    使用 NewID() 作为默认值。至少这是您为 SQL Server 所做的。

    【讨论】:

    • 我试过这个,但它似乎总是生成相同的标识符(这个:“00000000-0000-0000-0000-000000000000”)。所以在插入第二行时出现错误(插入已使用的主键)
    • 您应该直接在数据库中的表定义中设置 newId()!
    【解决方案2】:

    甚至更好:使用 newsequentialid() 作为 UNIQUEIDENITIFER 列的默认值。这将为您提供一系列有点顺序的 GUID。

    CREATE TABLE dbo.YourTable   
       (SerialID UNIQUEIDENTIFIER 
            CONSTRAINT DF_SerialID DEFAULT newsequentialid(),
         .... (other columns)......
       )
    

    问题是:newsequentialid 可用作列默认值 - 您不能将其作为函数或任何东西调用。但这似乎符合您的要求。

    更新:SQL Server Management Studio 中似乎存在一个已确认的错误,该错误阻止将 newsequentialid() 指定为交互式表设计器中列的默认值。

    见:http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/cad8a4d7-714f-44a2-adb0-569655ac66e6

    解决方法:创建表而不指定任何默认值,然后在普通查询窗口中键入此 T-SQL 语句并运行它:

    ALTER TABLE dbo.YourTable
        ADD CONSTRAINT DF_SerialID DEFAULT newsequentialid() FOR SerialID
    

    这应该可以解决问题!

    【讨论】:

    • 这对我来说一点也不麻烦。你的答案似乎是我想要的。我要试试:)
    • 我收到“验证 XY 列的默认值时出错”。你能控制你的代码吗(一个错字?)?
    • @drasto:我在发布之前在 SQL Server 2008 R2 上运行了该代码 - 它可以工作。你有什么版本的SQL Server???我删除了 newsequentialid() 周围的额外括号 - 也许这是一个问题?肯定适用于 2008R2
    • VS 2010 Ultimate 版中预装的那个。我不确定在哪里可以找到服务器的版本,但我会查找它。
    • @drasto: 似乎是一个 SQL Server Management Studio 错误:social.msdn.microsoft.com/Forums/en-US/sqltools/thread/… - 输入语句作为 SQL 代码并运行它!
    【解决方案3】:

    我猜你的意思是 SQLServer 而不是 C#...

    将列设置为 PRIMARY KEY 和 ROWGUID

    RowGuid http://img341.imageshack.us/img341/8867/sqlserverrowguid.png

    【讨论】:

    • 只要确保使用使它成为表上的聚集索引!!
    • 为什么不呢?我在一个项目上使用它并且工作正常,一切看起来都很正常,检查了执行计划,表排序,一切都很正常......
    • GUID 作为聚集索引非常糟糕:查看sqlskills.com/BLOGS/KIMBERLY/post/… - 它们会导致大量页面和索引碎片
    • @marc_s 将其存储为 nvarchar(36)CI 更好?
    • @Zapnologica: 不! 它也有同样的问题:太宽了,而且完全随机 - 此外,它现在是可变长度 -这让事情变得更糟!
    【解决方案4】:

    我认为

    CREATE TABLE dbo.YourTable
    (
        SerialID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT newsequentialid()
    )
    

    更简单

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2012-06-02
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多