备份数据库遇到一个问题,就是将旧数据搬移到新主机数据表的时候,如果主键是的 IDENTITY 是设定自动增加的话,那么旧有的主键数据,在新数据表上面就好像是重新编号一样又从第 1 笔开始塞到第 N 笔。
例如 :
某台主机上旧有数据如下,C1 字段是自动编号,但是可能经过使用者动作,可能只剩下 1、3、4、7、11 这几笔。
塞到新数据表,C1 字段就变成 1、2、3、4、5 完全走样了。
后来发现原来要设定 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 就跟旧有的数据表一模一样啰。