0

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 を使用しています。

4

1 に答える 1

0

主キー違反は、挿入しようとしているcustomer_keyinの値の少なくとも 1 つが、in の別の Customer レコードで既に使用されていることを示しています (これに対して delete ステートメントを既に実行していると仮定します)。A.tableB.TableAcustomer_code

これは、サロゲート ID 列を 2 つのテーブル A と B の間で同期させようとすることを検討するには、すでに遅すぎることを意味します (該当する場合は、最初からcustomer_key切り捨ててコピーする立場にないとおっしゃっています)。ただし、顧客の一意の識別 (冪等性) も提供していないようです (削除により 10 行が削除されたため)。ABcustomer_code

要約すると、 以外のリンクを確立する必要がなくcustomer_code、場合によっては を介し​​て、新しい ID が割り当てられるcustomer_nameデータをコピーできます。Acustomer_key

(つまり、IDENTITY_INSERTOFFのままにする)

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

次に、次のようにデータを挿入してリンクします (ここでも、IDENTITY INSERTテーブル A はオフのままです)。

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'
于 2013-01-23T10:15:23.030 に答える