在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','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数据库管理系统中,自动增长(Identity)字段是一个非常重要的特性,主要用于为表中的记录生成唯一的标识符,通常作为主键使用。本教程将详细解释如何在SQL Server中设置和管理自动增长字段。 首先,...
总的来说,理解如何在SQL Server中操作自增长列是数据库管理的关键技能之一,尤其是在进行数据迁移、整合或维护序列化主键时。正确使用 `SET IDENTITY_INSERT` 可以帮助我们灵活地处理自增列,同时确保数据的完整性...
在SQL Server数据库中,主键自增长列是一个重要的特性,它允许你在插入新记录时自动为该列生成唯一的标识符,通常用于唯一地标识表中的每一行。这在处理大量数据时尤其有用,因为它简化了数据插入过程,你无需手动为...
在SQL Server 2012中,用户可能会遇到一个特定问题,即在重启数据库服务后,自增ID字段(如主键)会自动跳过1000个值。这可能会对数据一致性造成影响,尤其是在有严格顺序需求或依赖于这些ID的业务逻辑中。本文将...
SQL Server还允许用户通过`SET IDENTITY_INSERT`命令暂时禁用和启用自动增长,以便在特定情况下插入自定义的主键值。 Oracle数据库采用不同的机制,它使用序列(Sequences)来生成自动增长的主键。首先,你需要创建...
### SQL Server 2005+ 版本行列转换数据脚本知识点解析 #### 一、数据表创建脚本分析 根据题目中的信息,我们首先关注到的是一个名为`dduser`的数据表创建脚本。该脚本是在SQL Server 2005及以上版本中使用的。...
在SQL Server数据库设计中,有时候我们需要创建一个列,它的值能自动递增,这通常用于主键字段,确保每一行数据都有唯一的标识。这个特性在SQL Server中被称为“标识列”(Identity Column)。下面我们将详细讲解...
在SQL Server中,自动增长列是一种特殊的列类型,通常用于主键或唯一标识符,它会自动为每一行分配一个唯一的数值,无需手动输入。这种列的设置有助于确保数据的完整性,因为它能防止重复值的插入。然而,在某些操作...
在SQL Server数据库管理系统中,自动增长(Auto Increment或Identity)是一种特性,用于为表的特定列(通常是主键)自动生成唯一的序列号。这在创建新记录时非常有用,特别是当你不想手动为每条记录分配唯一标识符时。...
【SQL Server数据库主键选取策略】 在数据库设计中,主键起着至关重要的作用...在实际操作中,还可以结合数据库管理系统提供的特性,如SQL Server的Identity和NewID(),以及利用DataRelation和事务处理来优化操作流程。
4. **自增长(IDENTITY)**: - `IDENTITY`属性通常与`PRIMARY KEY`一起使用,用于自动生成唯一的整数值。 - 示例: ```sql CREATE TABLE Persons ( Id_P int IDENTITY(1,1) PRIMARY KEY, LastName varchar...
为了更好地使用SqlServer,需要掌握一些基本的语法和约束。 一、约束种类 在SqlServer中,约束是一种限制或规则,用于确保数据的正确性和一致性。常见的约束种类有: 1. 默认约束(Default):用于指定列的默认值...
- `ID int IDENTITY(1,1) PRIMARY KEY`:表示创建一个名为`ID`的整型字段,并设置为自增长字段,起始值为1,每次增加1。同时,该字段被设为主键,确保每一行数据的唯一性。 - `FullName varchar(50) NULL`:创建一...
### 中国省市县关联SqlServer知识点解析 #### 一、背景介绍 在许多业务场景中,如物流配送、电商系统、地方政策实施等,都需要用到详细的地理位置信息——具体到省市县这一级别。为了方便地存储与查询这些地理信息...