自动增量唯一标识符

27

基本上,我想以与 identity 相似的方式使用 uniqueidentifier。 我不想向其插入值,它应自动插入值,每行有不同的值。 我无法在 uniqueidentifier 类型的列上设置自动增量(属性“autoincrement”设置为 false,不可编辑)。

4个回答

32

或者更好的方法是:将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

那应该就行了!


这对我来说一点问题都没有。你的答案似乎是我正在寻找的。我会尝试一下 :) - Rasto
我收到了“验证XY列默认值错误”的消息。请检查您的代码(是否有拼写错误)? - Rasto
如果唯一标识字段是顺序的,即使该字段是主键,集群化和分页仍然会成为一个问题吗? - Justin T. Watts
@JustinT.Watts:是的 - 它仍然不如使用 INT IDENTITY 优化(因为 GUID 是 16 个字节而不是 4 个字节 - 大小增加了 4 倍),但它比完全随机的 newid() GUID 更可靠。我仍然更喜欢 INT IDENTITY - marc_s
@marc_s 我同意它更大,我只是在想我们在工作中用完了 INT 的 ID,想知道为什么不直接使用 GUID 而不必担心大约 1000 年左右的问题,哈哈,是否有关于 INT 或 BIGINT 相对于顺序 GUID 更具性能的研究? - Justin T. Watts
显示剩余6条评论

7

3
请确保不要将其设置为表的聚集索引! - marc_s
2
GUID作为聚集索引非常糟糕:请查看http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx - 它们会导致大量的页面和索引碎片化。 - marc_s
@marc_s 把它存储为 nvarchar(36)CI 更好吗? - Zapnologica
1
@Zapnologica:不行! 它有相同的问题:太宽了,完全随机 - 而且,它现在是可变长度 - 这使得情况更糟! - marc_s
@marc_s,我只是想澄清一下,使用16字节的Guid的概念是不好的,还是仅仅因为它被定义为“UniqueIdentifier”? - Zapnologica
显示剩余2条评论

4

I think

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

更简单

3

使用NewID()作为默认值。至少在SQL Server中是这样做的。


我尝试过这个,但似乎总是生成相同的标识符(即“00000000-0000-0000-0000-000000000000”)。因此,在插入第二行时,我会收到错误提示(尝试插入已经使用的主键)。 - Rasto
你应该直接在数据库表定义中设置 newId()! - MUG4N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接