質問

なMySQLの答えてください!

基本クエリは以下の通りとキー)

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

ソースが多く含まれる記録ができ先、その挿入に失敗しますと、重複レコードが発生します。

ご希望の挙動挿入または無視する

このシナリオのために指定された問題です。挿入できれば、そうでないます。

擬似的なデザインインタフェース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) 

最後のクエリー、すなわち、チェックする前に挿入します

何をしなくても代替の取扱い共通したものですか。その是非にこれらすことができないのか?

役に立ちましたか?

解決

一部のデータベースを明示的な書式のための作業条件の挿入/更新は無視します。

OracleSQLServer, 例えば、合併決できるの挿入/更新-削除/無視する記録に基づく一定の前提.

を無視してデータベース固有の構文を行うことができ、挿入用の述語を除いた記録が存在する:

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)

他のヒント

あなたは、共通の主キーを共有している場合:

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 );

私はおそらく次の操作を行います。

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

MySQLを使用してUNIQUEインデックスを使用して、非重複キーを強制するの贅沢を持っている場合、あなたは重複の冪等(NO-OP)のアップデートでINSERT ON DUPLICATE KEY UPDATEを使用することができます。

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

これは非常に高速であることと、余分なSELECTを必要としないという利点を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top