标识插入少量记录而不截断到现有表

时间:2013-01-23 09:55:20

标签: sql-server constraints primary-key unique-constraint identity-insert

我想从B服务器的A服务器中的表中插入数据。

前:

select count(*) from A.table
-- 100 rows affected


delete from A.table where customer_code = '100'
-- 10 rows affected

select count(*) from B.table
-- 200 rows affected

select count(*) from B.table where customer_code='100'
-- 20 rows affected

both the tables have identity(1,1) and primary_key


insert into A.table(customer_key,customer_code,custome_name)
select customer_key,customer_code,custome_name  
    from B.table where customer_code='100'
  

- 违反PRIMARY KEY约束。无法在对象'A.table'中插入重复键。

我已经尝试了

SET IDENTITY_INSERT <> ON
DBCC CHECKIDENT(<>, RESEED,0)

我正在使用SQL Server 2005.

1 个答案:

答案 0 :(得分:0)

主要密钥违规告诉您,您尝试从customer_key插入的A.tableB.Table的至少一个值已用于其他客户在A中记录(并假设您已经为此customer_code运行了删除语句。)

这意味着考虑尝试在两个表A和B之间保持代理身份列customer_key同步已经太晚了(正如你所说,你不能截断{{1}如果适用,从A开始从头开始复制。但是,B似乎没有提供客户的唯一标识(幂等)(因为删除删除了10行)。

总而言之 - 如果您不需要通过customer_code建立任何链接,并且可能通过customer_code建立链接,则可以将数据复制到customer_name,这将被分配新身份A

(即离开customer_key OFF)

IDENTITY_INSERT

否则,如果确实需要唯一标识表之间的行,则需要为2个表之间的链接添加新存储。一种快速而肮脏的方式是将B的代理直接添加到A中,如下所示:

insert into A.table(customer_code,custome_name)
select customer_code,customer_name  
    from B.table where customer_code='100'

然后插入并链接数据(同样,表{A} ALTER TABLE A.table ADD customer_key_TableB INT NULL -- Or whatever the type of `customer_key` GO 仍然关闭):

IDENTITY INSERT