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

问题描述 投票:0回答:1

我想从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。

sql-server constraints primary-key unique-constraint identity-insert
1个回答
0
投票

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

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

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

(即离开IDENTITY_INSERT关闭)

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

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

ALTER TABLE A.table ADD customer_key_TableB INT NULL  -- Or whatever the type of `customer_key`
GO

然后像这样插入和链接数据(再次,表格A的IDENTITY INSERT仍然关闭):

insert into A.table(customer_code, customer_name, customer_key_TableB)
select customer_code, customer_name, customer_key
    from B.table where customer_code='100'
© www.soinside.com 2019 - 2024. All rights reserved.