SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()

SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID(),第1张

概述在SQLServer2005环境下,表的主键应该怎样设计. 目前主要用到的主键方案共三种 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1、先说自动增长主键,它的优点是简单,类型支持bigint.但是它有致命的弱点: 当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制 *** 作),自动增长型字段可能造成数据合并时的主键冲突。设

sqlServer2005环境下,表的主键应该怎样设计.

目前主要用到的主键方案共三种

自动增长主键

手动增长主键

UNIQUEIDENTIFIER主键

1、先说自动增长主键,它的优点是简单,类型支持bigint.但是它有致命的弱点:

当我们需要在多个数据库间进行数据的复制时(sql Server的数据分发、订阅机制允许我们进行库间的数据复制 *** 作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

2、再说手动增长主键,它的优点是自行定制主键列,主键列的数据类型乃至数据样本都可以控制,能够稳定的获得目标键值,不会重复.但是它维护成本比较搞,首先生成键值需要自行编写存储过程来产生,网络开销大,运行时还要考虑到并发冲突等等.

3、最后就是UNIQUEIDENTIFIER主键,它利用GUID作为键值,可以直接调用newID()来获得全局唯一标识,即便合并数据表也不会有重复现象.但是UGID有两个弱点:其一,和int类型比较,GUID长度是前者4倍.其二,用newID()获得的GUID毫无规律,因为该列作为主键,必然有聚集索引,那么在插入新数据时,将是一个非常耗时的 *** 作.这样的话UNIQUEIDENTIFIER作为主键将大大有损效率.

所以sqlServer2000环境下DBA们往往写一个存储过程来生成与时间有关的GUID,即在GUID前面加上生成时间.这样确保生成出来的主键全局唯一并且按时间递增.不过这又回到了第二种主键方案,不便维护.

4、sqlServer 2005已经解决了这个问题,使用的是NEWSEQUENTIALID()

这个函数产生的GUID是递增的,下面看下它的用法

--创建实验表

--1创建ID列的类型为UNIQUEIDENTIFIER

--2ROWGUIDCol只是这个列的别名,一个表中只能有一个

--3PRIMARY KEY确定ID为主键

--4使用DEFAulT约束来自动为该列添加GUID

create table jobs

(

ID UNIQUEIDENTIFIER ROWGUIDCol PRIMARY KEY  NOT NulL

CONSTRAINT [DF_jobs_ID] DEFAulT (NEWSEQUENTIALID()),

account varchar(64) not null,

password varchar(64) not null

)

go

 

select * from jobs

--添加实验数据

insert jobs (account,password) values ('tudou','123')

insert jobs (account,password) values ('ntudou',password) values ('atudou',password) values ('btudou',password) values ('ctudou','123')

 

select * from jobs

结果:

--使用IDentity的是我们可以通过Select @@IDENTITY取到新添加的ID

--使用UNIQUEIDENTIFIER怎么办呢?

--采取手动增长的方法select NEWSEQUENTIALID()先取出ID再添加

--不行,语法不支持

--可以通过下面的方法取到新添加数据的ID

--ADO.NET中的用法和Select @@IDENTITY一样

DECLARE @outputtable table(ID uniqueIDentifIEr)

INSERT INTO jobs(account, password)

OUTPUT INSERTED.ID INTO @outputtable

VALUES('dtudou', '123')

 

SELECT ID FROM @outputtable

 

--对比下数据

select * from jobs

 结果:

--ROWGUIDCol是主键列的别名,可以直接当做列名来使用

--这样可以忽略主键列的名称

insert jobs (account,password) values ('etudou','123')

select ROWGUIDCol from jobs

 

 结果:

上一篇SQLServer 2005 实现交叉表格报表的利器 PIVOT 和 UNPIVOT 关系运算符 下一篇SQL SERVER 2005 简介 总结

以上是内存溢出为你收集整理的SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()全部内容,希望文章能够帮你解决SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/1166064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存