首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顺序NEWID()

顺序NEWID()
EN

Stack Overflow用户
提问于 2009-12-12 17:50:40
回答 4查看 4.3K关注 0票数 3

我正在使用sql server 2008。有没有办法生成一个唯一的序列号?它应该显示NEWID()和标识列的属性,这意味着它始终是唯一的,但随后的每个值都大于前一个值。它不能是datetime/datetime2,因为它不够唯一。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-14 21:02:30

ROWVERSION数据类型是一种可能,尽管它不适合用作主键;它也是自动设置的。

另一种选择是自己创建它。创建一个具有所需宽度的表,并使用一些代码自动递增该值并返回该值。通过适当的锁定或事务,您可以使用它来生成适合作为主键的值。

您还可以使用SQL CLR函数执行类似的操作。这样也有可能让它更有效率。例如,您可以使用当前时间,但将最后返回的值存储在静态。然后,如果下一个值与上一个值相同,则递增1。

票数 1
EN

Stack Overflow用户

发布于 2009-12-12 17:55:54

代码语言:javascript
复制
CREATE TABLE demo_table (
    demo_id    uniqueidentifier NOT NULL,
    demo_value int
);

ALTER TABLE demo_table  ADD CONSTRAINT dc_demo
                        DEFAULT NEWSEQUENTIALID()
                        FOR demo_id;

您必须对顺序唯一标识符使用默认约束。

不幸的是,NEWSEQUENTIALID()的局限性在于它不能保证机器重新启动后的顺序。

NEWSEQUENTIALID() 的主要目标是快速插入B树,机器重启问题不会影响这一点。这里记录了这一点:

您可以查看这篇文章,了解NEWID()NEWSEQUENTIALID()IDENTITY之间的性能比较:"The Code Project: Performance Comparison - Identity() x NewId() x NewSequentialId“。

票数 7
EN

Stack Overflow用户

发布于 2009-12-12 20:09:39

对于重新启动后严格单调递增,请使用数字标识。NEWSEQUENTIALID不支持此功能。

除非你发明了自己的组合列,否则你不能既有蛋糕又吃蛋糕。然而,这使得事情变得更加宽泛和笨拙。

鉴于IDENTITY和NEWSEQUENTIALID都应该仅供内部使用(例如,人类不可读),为什么要这样做?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1892919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档