【发布时间】:2009-04-10 20:40:56
【问题描述】:
我在 sql server management studio 中遇到 newsequentialid() 学习问题。创建一个包含唯一标识符列“UniqueID”的表,并将默认值设置为 newsequentialid()。
步骤 1. 保存设计:
'Table_1' 表 - 验证列“UniqueID”的默认值时出错。
还是保存吧。
第二步,查看sql:
CREATE TABLE [dbo].[Table_1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[UniqueID] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table_1] ADD CONSTRAINT [DF_Table_1_UniqueID] DEFAULT (newsequentialid()) FOR [UniqueID]
GO
看起来很合理。
第 3 步。添加一些行:
1 test 72b48f77-0e26-de11-acd4-001bfc39ff92
2 test2 92f0fc8f-0e26-de11-acd4-001bfc39ff92
3 test3 122aa19b-0e26-de11-acd4-001bfc39ff92
它们看起来不是很连续。 ??
编辑:如果插入全部一次完成,我已经让它工作了一些,那么唯一 id 是连续的。在以后的插入中,sql server 似乎忘记了最后的顺序 id,并开始一个新的序列。
在 ssms 中运行它会产生 squential guid:
insert into Table_1 (Name) values('test13a');
insert into Table_1 (Name) values('test14a');
insert into Table_1 (Name) values('test15a');
insert into Table_1 (Name) values('test16a');
insert into Table_1 (Name) values('test17a');
【问题讨论】:
-
newsequentialid() 是从哪里来的?
-
这是一个糟糕的函数名。 GUID 不是连续的,而是单调递增的。对于这种类型的 guid,47 个字节是 MAC 地址,16 个是时钟周期,60 位是自 1582 年 10 月 15 日以来的时间,增量为 100 纳秒。如果您好奇,可以查看 RFC 4122 的第 4.2 节。
-
值不是按 GUID 的文本表示排序,而是按内部二进制值排序 ~ Pro SQL Server 2008 关系数据库设计和实现第 628 页唯一标识符
标签: sql-server