复制当前身份

时间:2018-12-06 05:06:14

标签: sql sql-server

我有一个表Temp_Identity和一个IDENTITY列。

进行复制时,该表中的数据已正确复制。但是不会复制其当前身份。

这意味着生产数据库中该表的当前标识为10。但是在复制数据库中,该表仍为1。

有什么方法可以自动解决此问题而无需手动进行?

表结构

 CREATE TABLE Temp_Identity
(
ID Int IDENTITY(1,1) Primary Key,
Name Varchar(100)
)

当我在生产数据库中插入以下值时,它在复制数据库中正确生效

INSERT INTO Temp_Identity
SELECT 'AA'
UNION ALL
SELECT 'BB'
UNION ALL
SELECT 'CC'

当我从复制数据库插入给定行时,出现错误。

 INSERT INTO Temp_Identity
  SELECT 'DD'

这是因为,在复制数据库中,该表包含三行,执行上述插入操作时,ID列的值为'1'(生产数据库中该表的当前标识为3,但是在复制数据库为1。它应该与生产数据库相同。它已经存在于表中。因此引发了主键错误。

1 个答案:

答案 0 :(得分:0)

在这种情况下,这种方法可能可行。

create table tmptbl  (ID int identity(1,1) Primary key clustered, name varchar(100)) 
insert into tmptbl   
Select 'A' union all 
Select 'B' union all
Select 'C' 

创建备份表

create table tmptbl_BCK  (ID int identity(1,1) Primary key clustered, name varchar(100)) 
insert into tmptbl_BCK   
select name  from tmptbl
delete from  tmptbl_BCK --to create the scenario this will remove the previous identity keys and create new keys for new insert. 

 insert into tmptbl_BCK 
 select name  from tmptbl 

select * from tmptbl (in original table) 
ID  name
1   A
2   B
3   C

select * from tmptbl_BCK  
ID  name
10  A
11  B
12  C

您可以借助“设置标识插入”选项来确保这些表中的标识相同。首先,请确保删除行。

delete from  tmptbl_BCK
set identity_insert tmptbl_BCK On 
insert into tmptbl_BCK (ID, Name) select ID, name from tmptbl 
set identity_insert tmptbl_BCK Off 
select * from tmptbl_BCK

Output you get: 
ID  name
1   A
2   B
3   C

现在,如果您希望具有与生产相同的标识值(在您的复制表中),则可以使用这种方式。

 Declare @reseedvalue int = (Select IDENT_CURRENT('tmptbl')) --though it gives you the last inserted value, next time it reseeds it will be 4 in your production table and replication table 
--select @reseedvalue

--to reseed based on your production table 
DBCC CHECKIDENT ('tmptbl_BCK', RESEED, @reseedvalue)

--test if it creates 4 in your back up table 
insert into tmptbl_BCK  
             select 'D' 
select * from tmptbl_BCK