`
java-mans
  • 浏览: 11449862 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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前面加上生成时间.这样确保生成出来的主键全局唯一并且按时间递增.不过这又回到了第二种主键方案,不便维护.

4SQLServer 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','123')

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

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

insert jobs (account,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

结果:

分享到:
评论

相关推荐

    SQL Server设置主键自增长列(使用sql语句实现)

    新建一数据表,里面有字段id,将id设为主键且自动编号 代码如下: create table tb(id int identity(1,1),constraint pkid primary key (id)) create table tb(id int identity(1,1) primary key ) 3.已经建好一数据...

    SQL Server 打开或关闭自增长

    其中id列是自曾列,如果我们要插入3 | c的话,如果没有打开自增列,肯定是插不进去的,这时候用这个函数就有作用了 代码如下:SET IDENTITY_INSERT [Recursive] ON   INSERT INTO [Recursive](id,text) VALUES(3,...

    sqlserver自定义函数

    ---在sql2005下创建测试数据表,如果是sql2005则用本段来判断数据表是否存在 ---if exists(select 1 from sys.tables where name='w01') ---drop table w01 ----开始创建测试数据库 GO create table w01(gs903 ...

    sqlserver存储过程

    Id int identity(1,1) not null primary key, --顾客编号,主键 按一进行自动增长 UserName varchar(50)not null, PassWord varchar(50)not null, Address varchar(250)not null, ) go ------------------------...

    mysql把主键定义为自动增长标识符类型

    1、把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: ...在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动

    【原创精华】sql server 约束详解

    1.非空约束 not null:数据不能为空 2.主键约束primary key(列名):保证记录唯一性,要求值必须唯一且不能为空;一个表只能有一个主键 GroupId int identity(1001,1) primary ...4.自增长identity(开始值,增长因

    网吧管理系统数据库设计报告.doc

    张晓丽等,中文版Visual Basic 6.0程序设计与应用,人民日报出版社,2003.9 1.5术语与缩写解释 "缩写、术语及符号 "解 释 " "Micrsoft SQL Server 2005 "微软SQL Server2005 " "SD "系统设计,System Design " 2....

    经典SQL语句大全

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    Hibernate注解

    * 1.native 对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制), * native就是将主键的生成工作将由数据库完成,hibernate不管(很常用) * 例:@GeneratedValue(generator = ...

    【总结】数据库自增字段的 3 种实现方式

    在设计数据库的表结构时,经常会使用一个自动增长的数字序列作为主键字段(代理主键)。除了作为主键使用之外,自增字段也可以用于记录各个操作发生的先后顺序,因为它具有递增特性。当我们插入一行数据时,数据库会...

    sql经典语句一部分

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    数据库操作语句大全(sql)

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db ...

    ado[1].net中文手册 学习 ado.net的重要资料

    检索“标识”或“自动编号”值:提供一个特定示例,它将为 Microsoft SQL Server 表中的“标识”(Identity) 字段所生成的值以及 Microsoft Access 表中的“自动编号”(Autonumber) 字段映射到表中插入行的列。...

Global site tag (gtag.js) - Google Analytics