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