MySQLでバッチ挿入を行う方法


148

テーブルに入力する必要のあるレコードが1つ以上あります。クエリでこれを行う最良の方法は何ですか?ループを作成し、反復ごとに1つのレコードを挿入する必要がありますか?またはより良い方法はありますか?


1
ステートメントまたは関数を使用する前に、ドキュメントをお読みください。INSERTこれをネイティブでサポートします
オービットの軽量レース、2011

3
非常に多数のレコードがあり、それらをCSVファイルとしてフォーマットできる場合は、LOAD DATA INFILEステートメントまたはmysqlimportコマンドを確認してください。
squawknull

レコードの場合、LOAD DATAは、CSV入力を必要としない非常に柔軟なコマンドです。任意のテキスト形式で実行でき、入力データの解析と操作に役立つパラメーターが多数あります。これは間違いなく、ローカルデータベースにデータをロードする最も速い方法です。上記の「最良」の意味は明確ではありません。つまり、単純性(INSERTステートメントを使用)が速度(LOAD DATAを使用)より優先されるかどうかはわかりません。
EdwardGarson

回答:


298

MySQLマニュアルから

VALUES構文を使用するINSERTステートメントは、複数の行を挿入できます。これを行うには、それぞれが括弧で囲まれ、コンマで区切られた列値の複数のリストを含めます。例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

7
これはLoad Data Infileよりも遅いですか?
12

ストアドプロシージャでこの挿入ステートメントを書き込む構文は何ですか?
Nitin Sawant 2013

@Nitinは同じ構文ではないでしょうか.. ??? とにかく、SQL Serverでそれを行います。
2013年

13
質問には「バッチ挿入の方法」というラベルが付いていますが、この回答は実際には一括挿入であることに注意してください。バルクの方が通常は高速です。この質問を
マイクデメノク2013

2
@Koffeehaus @Lukman からのこのSOの回答ごとに、挿入できる値/行の数はmax_allowed_packet
Sepster

22

ほとんどの場合、MySQLクライアントでは作業していないため、適切なAPIを使用して挿入をバッチ処理する必要があります。

例:JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
バッチ挿入のブログエントリ良い(Javaでは、それはどの言語に関連します): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

データデータファイルクエリをロードする方がはるかに優れたオプションですが、godaddyなどの一部のサーバーでは、共有ホスティングでこのオプションを制限しているため、残りの2つのオプションは、反復またはバッチ挿入ごとにレコードを挿入しますが、クエリがこれを超える場合、バッチ挿入には文字の制限があります。 mysqlで設定された文字数、クエリがクラッシュするので、バッチ挿入でデータをチャンクに挿入することをお勧めします。これにより、データベースで確立される接続の数が最小限になります。


1
どうですかLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j 2014年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.