我有一个表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。它应该与生产数据库相同。它已经存在于表中。因此引发了主键错误。
答案 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