2011-01-14 4 views
0

私のアプリ(MySQLを使用している)は、後続のupsertsを多数実行しています。今、私のSQLは次のようになります。できるだけ速いupsertsを大量に実行する

INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL OR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 

これまでのところ私はアップサートを達成するための最速の方法であることをINSERT IGNOREを見つけました。レコードが存在するかどうかを確認するためにレコードを選択し、それを更新するか、新しいレコードを挿入するのは遅すぎます。各レコードごとに個別のステートメントを行う必要があるため、これは私が好きなほど速くはありません。時には、これらのステートメントのうち約50,000を連続して使用することがあります。

既存のレコードを削除せずに、これらのすべてを1つのステートメントで処理する方法はありますか?

答えて

0

1つのインサートにすべてを入れることができます INSERT IGNORE INTO table_1 (field1, field2) VALUES ('val1', 'val2'), ('val3', 'val4'), etcまた、レコードを更新するか挿入する必要がある場合は、INSERT ... ON DUPLICATE KEY UPDATEをチェックすることもできます。

+0

このようなINSERT IGNOREを使用すると、レコードが1つでも存在してもクエリ全体を無視しないでしょうか?残念ながら、長い説明が必要な理由で、 'ON DUPLICATE KEY UPDATE'を使用することはできません。 –

+0

'IGNOREキーワードを使用すると、INSERT文の実行中に発生するエラーは、代わりに警告として扱われます。たとえば、IGNOREを使用しない場合、テーブル内の既存のUNIQUEインデックスまたはPRIMARY KEY値を複製する行によって重複キーエラーが発生し、そのステートメントは中止されます。 IGNOREでは、行はまだ挿入されませんが、エラーは発行されません。 ' – dkarp

+0

'REPLACE INTO'もオプションですが、既存の行を削除して置換するため、INSERT IGNOREより効率が悪くなります。 – dkarp

関連する問題