我正在使用sql server 2008。有没有办法生成一个唯一的序列号?它应该显示NEWID()和标识列的属性,这意味着它始终是唯一的,但随后的每个值都大于前一个值。它不能是datetime/datetime2,因为它不够唯一。
谢谢。
发布于 2009-12-14 21:02:30
ROWVERSION数据类型是一种可能,尽管它不适合用作主键;它也是自动设置的。
另一种选择是自己创建它。创建一个具有所需宽度的表,并使用一些代码自动递增该值并返回该值。通过适当的锁定或事务,您可以使用它来生成适合作为主键的值。
您还可以使用SQL CLR函数执行类似的操作。这样也有可能让它更有效率。例如,您可以使用当前时间,但将最后返回的值存储在静态。然后,如果下一个值与上一个值相同,则递增1。
发布于 2009-12-12 17:55:54
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“。
发布于 2009-12-12 20:09:39
对于重新启动后严格单调递增,请使用数字标识。NEWSEQUENTIALID不支持此功能。
除非你发明了自己的组合列,否则你不能既有蛋糕又吃蛋糕。然而,这使得事情变得更加宽泛和笨拙。
鉴于IDENTITY和NEWSEQUENTIALID都应该仅供内部使用(例如,人类不可读),为什么要这样做?
https://stackoverflow.com/questions/1892919
复制相似问题