1

いいえ MySQL の回答をお願いします!

基本的なクエリは次のとおりです (A がキーであると仮定します)。

INSERT INTO destination (A,B,C)
SELECT a1,b1,c1 
FROM source
WHERE (selectconditions) ; 

ソースには、宛先にまだある場合とない場合がある多くのレコードが含まれています。これは、重複レコードが検出されるとすぐに挿入が失敗することを意味します。

望ましい動作: INSERT または IGNORE

これは、特定の問題の望ましいシナリオです。可能であれば挿入し、そうでなければ続行します。

疑似 c#/java:

foreach(record in selectQuery) 
{  
   try { destination.insert(record) } 
   catch(insertionException){//squelch} 
}

これは、追加することで SQL で処理できます。

AND NOT EXISTS (SELECT A FROM destination INNER JOIN source on destination.A = source.a1) 

クエリの最後まで -- つまり、挿入する前に確認してください。

この一般的な状況を処理するための他の代替手段は何ですか? これらの手法の長所と短所は何ですか?

4

4 に答える 4

2

一部のデータベースは、条件付き挿入/更新/無視を含む操作の明示的な構文を提供します。

たとえば、 OracleSQLServerには、一連の述語に基づいてレコードを挿入/更新/削除/無視できるMERGEステートメントがあります。

データベース固有の構文を無視して、既存のレコードを除外する述語を使用して挿入を実行できます。

INSERT INTO target( A, B, C )
SELECT SA, SB, SB FROM source
WHERE NOT EXISTS (select A, B, C from TARGET where A = SA, B = SB, C = SC)
于 2009-07-20T21:11:30.583 に答える
1

共通の主キーを共有する場合:

INSERT INTO destination 
( A, B, C)
SELECT a1, b1, c1 FROM source
WHERE source.pk not in ( SELECT pk FROM destination );

そうでない場合:

INSERT INTO destination 
( A, B, C)
SELECT a1, b1, c1 FROM source
WHERE a1 + b1 + c1 not in ( SELECT a+b+c FROM destination );
于 2009-07-20T20:56:17.883 に答える
0

UNIQUEMySQL を使用していて、インデックスを使用して非重複キーを強制する余裕がある場合は、重複INSERT ON DUPLICATE KEY UPDATEのべき等 (操作なし) 更新を使用できます。

INSERT INTO Target (A, B, C) (SELECT a1, b1, c1 FROM Source) ON DUPLICATE KEY UPDATE A=A;

これには、非常に高速であり、追加の を必要としないという利点がありSELECTます。

于 2009-07-20T23:03:06.600 に答える
0

私はおそらく次のことをするでしょう:

INSERT INTO Target (A, B, C)
SELECT
     S.A, S.B, S.C
FROM
     Source S
LEFT OUTER JOIN Target T ON
     T.A = S.A AND
     T.B = S.B AND
     T.C = S.C
WHERE
     T.A IS NULL
于 2009-07-20T22:38:17.693 に答える