顺序NEWID()

时间:2009-12-12 09:50:40

标签: sql-server sql-server-2008

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

感谢。

4 个答案:

答案 0 :(得分:7)

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;

您必须对顺序uniqueidentifier使用默认约束。

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

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

您可以查看此文章,了解NEWID()NEWSEQUENTIALID()IDENTITY之间的效果比较:“The Code Project: Performance Comparison - Identity() x NewId() x NewSequentialId”。

答案 1 :(得分:2)

要在重启后严格单调增加,请使用数字IDENTITY。 NEWSEQUENTIALID不支持此功能。

除非你发明自己的组合柱,否则你不能吃蛋糕。然而,这使得事情变得更加广泛和使用起来更加麻烦。

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

答案 2 :(得分:1)

您可以在SQL Server 2008中将newsequentialid()定义为UNIQUEIDENTIFIER列的默认值 - 不幸的是,这就是您所能做的。

CREATE TABLE dbo.MyTable
(
    ID UNIQUEIDENTIFIER DEFAULT (newsequentialid())
    ......
)

无法以任何其他方式生成顺序ID(GUID): - (

答案 3 :(得分:1)

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

另一个选择是自己创建它。有一个表格,其中包含您需要的宽度列,并有一些代码以原子方式递增该值并返回它。通过适当的锁定或事务,您可以使用它来生成适合作为主键的值。

您也可以使用SQL CLR功能执行类似操作。也许有可能以这种方式提高效率。例如,您可以使用当前时间,但将最后返回的值存储在静态中。然后,如果下一个值与最后一个值相同,则递增1。