我在 sql server Management Studio 中遇到 newsequentialid() 学习问题。创建一个包含 uniqueidentifier 列“UniqueID”的表,并将默认值设置为 newsequentialid()。
步骤1.保存设计:
“Table_1”表 - 验证列“UniqueID”的默认值时出错。
无论如何保存它。
步骤2.查看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
Run Code Online (Sandbox Code Playgroud)
看起来很合理。
步骤 3. 添加一些行:
1 test 72b48f77-0e26-de11-acd4-001bfc39ff92
2 test2 92f0fc8f-0e26-de11-acd4-001bfc39ff92
3 test3 122aa19b-0e26-de11-acd4-001bfc39ff92
Run Code Online (Sandbox Code Playgroud)
它们看起来不太连续。??
编辑:如果插入全部一次性完成,那么唯一的 id 是连续的,我已经让它在某种程度上起作用了。在以后的插入中,sql server 似乎忘记了最后一个顺序 id,并开始一个新的序列。
在 ssms 中运行它会产生顺序向导:
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');
Run Code Online (Sandbox Code Playgroud)
newsequentialid主要是为了解决当你的表通过uniqueidentifier进行集群时的页面碎片问题。您的表由整数列聚集。我设置了两个测试表,一张的 newsequentialid 列是主键,一张不是主键(就像您的一样),并且在主键中 GUID 始终是连续的。另一方面,他们不是。
我不知道它的行为方式的内部/技术原因,但似乎很明显,newsequentialid() 仅当您的表由它聚集时才真正是顺序的。否则,它的行为似乎与 newid() / RowGuid 类似。
另外,我很好奇为什么在不必要的情况下你会想要使用 newsequentialid() 。它有许多 newid() 没有的缺点,也没有任何好处 - 最大的是 newid() 实际上不可预测,而 newsequentialid() 可以。如果你不担心碎片,那还有什么意义呢?
根据NEWSEQUENTIALID() 的定义,这些值实际上是“顺序的”:
创建一个 GUID,该 GUID 大于自 Windows 启动以来指定计算机上此函数先前生成的任何 GUID。
它并不是说 GUID 中不能有任何间隙,只是任何新的 GUID 都应该大于前一个 GUID。
尝试这个:
create table #test(id int, txt varchar(50), gid uniqueidentifier)
insert into #test
select 1 ,'test','72b48f77-0e26-de11-acd4-001bfc39ff92'
union select 2, 'test2', '92f0fc8f-0e26-de11-acd4-001bfc39ff92'
union select 3, 'test3', '122aa19b-0e26-de11-acd4-001bfc39ff92'
select * from #test
order by gid asc
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,记录的顺序为 1、2、3,这符合预期。
| 归档时间: |
|
| 查看次数: |
8468 次 |
| 最近记录: |