IDENTITY 的小技巧--SQL Server 2005

备份数据库遇到一个问题,就是将旧数据搬移到新主机数据表的时候,如果主键是的 IDENTITY 是设定自动增加的话,那么旧有的主键数据,在新数据表上面就好像是重新编号一样又从第 1 笔开始塞到第 N 笔。

例如 :

某台主机上旧有数据如下,C1 字段是自动编号,但是可能经过使用者动作,可能只剩下 1、3、4、7、11 这几笔。

clip_image002

塞到新数据表,C1 字段就变成 1、2、3、4、5 完全走样了。

clip_image004

后来发现原来要设定 IDENTITY_INSERT 的选项,才有办法自己设定自动编号的域值。

语法如下:

 

代码
-- 开启 TestTable 的 IDENTITY_INSERT 属性

SET IDENTITY_INSERT TestTable ON

-- 关闭 TestTable 的 IDENTITY_INSERT 属性

SET IDENTITY_INSERT [TestTable] OFF

--如果要重设数据表的 IDENTITY 的编号的话,则要使用 DBCC CHECKIDENT 指令来设定,以下为操作范例:

-- 将数据表数据删除, 并重设 IDENTITY

TRUNCATE TABLE [TestTable]

-- 开启数据表可自行输入 IDENTITY 的功能

SET IDENTITY_INSERT [TestTable] ON

-- 准备数据源

CREATE TABLE #tt
(
C1
int,
C2
nvarchar(50),
C3
nvarchar(50)
)

INSERT INTO #tt ( C1, C2, C3 )
VALUES ( 1, '1', '2' )
INSERT INTO #tt ( C1, C2, C3 )
VALUES ( 3, '2', '4' )
INSERT INTO #tt ( C1, C2, C3 )
VALUES ( 4, '3', '6' )
INSERT INTO #tt ( C1, C2, C3 )
VALUES ( 7, '4', '8' )
INSERT INTO #tt ( C1, C2, C3 )
VALUES ( 11, '5', '10' )


-- 将数据源塞入目的数据表

INSERT INTO [TestTable] ( C1, C2, C3 )
SELECT *
FROM #tt

Drop table #tt

-- 关闭数据表可自行输入 IDENTITY 的功能, 由系统自行指定
SET IDENTITY_INSERT [TestTable] ON

-- 将数据表的 IDENTITY 设为 11 (下一笔资料为 12)

DBCC CHECKIDENT (TestTable, reseed, 11)
DBCC CHECKIDENT (TestTable, reseed)

 

 

用以上语法产生新的 TestTable 就跟旧有的数据表一模一样啰。

clip_image002[1]

posted @ 2010-03-09 23:03  RicoRui  阅读(781)  评论(4编辑  收藏  举报