1

SQL データベースにテーブルがあり、ランダム(主キーで null ではない) とカウント(ID が 1 ずつ増加) の 2 つのフィールドがあります。ランダム フィールドに 10 億のレコードを挿入する必要があります。一度に 1000 行を挿入できました。これは、SQL Insert ステートメントが処理できる最大値であるためです (ADO.NET を使用する C# コンソール アプリケーションで)。

挿入しようとしているデータはランダムですが、一意ではありません。そのため、「主キーの違反....」という例外が発生しています。重複する値のみを削除する代わりに、1000 行すべてが削除されます。

挿入ステートメント (私の場合は 1000) のすべてのレコードではなく、重複する値のみを削除することで、一意の値を挿入することは可能ですか?

また、DataTable と SQLBulkCopy を使用して値を挿入しようとしましたが、成功しませんでした。

シナリオ例: TableA

乱数

100 1

101 2

(ランダム) TableA 値 (102)、(103)、(100)、(104)、(105)、(101) に挿入します。

100 と 101 は重複した値です。これらの値 (100,101) のみを削除し、他のすべての値 (102,103,104,105) を挿入する方法はありますか? (私のプログラムでは、主キー違反のためにすべての値が削除されています)

これに関するヘルプは大歓迎です。

ありがとう

4

1 に答える 1

0

IGNORE_DUP_KEY フラグの使用を試みることができます。Random から PrimaryKey を削除し、次のように UNIQUE 制約を追加します。

 ALTER TABLE dbo.TableA
   ADD CONSTRAINT UniqueRandomValue
   UNIQUE (Random) WITH (IGNORE_DUP_KEY = ON);

SQL サーバー - ストアド プロシージャ - 例外を無視

もう 1 つのオプションは、衝突を回避または処理する独自のロジックを作成することです。このような場合は、db 接続の繰り返しを防ぐために、ストアド プロシージャを使用することをお勧めします。データのバッチをパラメーターとして送信し、衝突を無視してストアド プロシージャ内に 1 つずつ挿入します。接続タイムアウトを回避するために、バッチ サイズを制限するように注意してください。バッチ サイズを動的に減少させることは、データ サイズが原因で発生するタイムアウトから回復するのに役立ちます。

BEGIN TRY
INSERT INTO TableA(Random) VALUES(@val);
END TRY
BEGIN CATCH
END CATCH;
于 2012-05-11T15:04:56.717 に答える