1

IGNORE_DUP_KEYを使用してテーブルに制約があります。これにより、一部のレコードが重複している場合とそうでない場合(非重複を挿入するだけ)で、一括挿入を部分的に機能させることができます。ただし、更新を部分的に機能させることはできません。複製が作成されないレコードのみを更新する必要があります。

更新を適用するときにIGNORE_DUP_KEYをサポートする方法を知っている人はいますか?

MSSQL2005を使用しています

4

3 に答える 3

1

実際に何が起こっているのかはわかりませんが、一括読み込みプロセスの一部として重複を挿入して主キーを更新する場合は、ステージングテーブルが解決策になる可能性があります。一括ロードの前に空であることを確認するテーブルを作成し、ファイルから100%の生データをロードして、そのデータを実際のテーブルに処理します(セットベースが最適です)。次のようにして、まだ存在していないすべての行を挿入できます。

INSERT INTO RealTable
        (pk, col1, col2, col3)
    SELECT
        pk, col1, col2, col3
        FROM StageTable s
        WHERE NOT EXISTS (SELECT
                              1
                              FROM RealTable r
                              WHERE s.pk=r.pk
                         )

そもそも重複を防ぐのが最善です。ステージングテーブルなどに参加することで、実際のテーブルでUPDATEを実行することもできます。これにより、制約を「回避」する必要がなくなります。制約を回避すると、通常、見つけにくいバグが作成されます。

于 2010-08-03T12:44:12.883 に答える
1

私が正しく理解していれば、重複の作成を避けるために必要なWHEREロジックを指定せずにUPDATEを実行したいですか?

create table #t (col1 int not null, col2 int not null, primary key (col1, col2))

insert into #t 
select 1, 1 union all 
select 1, 2 union all 
select 2, 3

-- you want to do just this...
update #t set col2 = 1

-- ... but you really need to do this
update #t set col2 = 1
where not exists (
    select * from #t t2
    where #t.col1 = t2.col1 and col2 = 1
    )

頭に浮かぶ主なオプションは次のとおりです。

  1. 重複の作成を回避するには、完全なUPDATEステートメントを使用してください
  2. INSTEAD OF UPDATEトリガーを使用して、UPDATEを「インターセプト」し、重複を作成しないUPDATEのみを実行します。
  3. カーソルなどの行ごとの処理手法を使用し、各UPDATEをTRY ...CATCH...または言語に相当するものでラップします。

何をしようとしているのか、どの環境で作業しているのかによって異なるため、どちらが最適かは誰にもわからないと思います。ただし、行ごとの処理によって誤検知が発生する可能性があるため、セットベースのアプローチに固執しようとします。

于 2010-08-03T13:15:36.860 に答える
0

MERGEステートメントを使用する必要があると感じています。その後、更新部分では、一意にしたいキーを実際には更新しないでください。これは、キーが一意であることをテーブルで定義する必要があることも意味します(一意のインデックスを設定するか、主キーとして定義します)。その後、重複キーを使用した更新または挿入は失敗します。

編集:私はこのリンクがそれに役立つと思います:

http://msdn.microsoft.com/en-us/library/bb522522.aspx

于 2010-08-03T11:10:05.933 に答える