Bagaimana melakukan batch batch di MySQL


148

Saya memiliki 1-banyak jumlah catatan yang perlu dimasukkan ke dalam tabel. Apa cara terbaik untuk melakukan ini dalam kueri? Haruskah saya membuat satu lingkaran dan memasukkan satu catatan per iterasi? Atau ada cara yang lebih baik?


1
Silakan baca dokumentasi untuk pernyataan atau fungsi sebelum mencoba menggunakannya. INSERTmendukung ini secara asli !
Lightness Races di Orbit

3
Jika Anda memiliki jumlah rekaman yang sangat besar dan dapat memformatnya sebagai file CSV, periksa pernyataan LOAD DATA INFILE atau perintah mysqlimport.
squawknull

Sebagai catatan, LOAD DATA adalah perintah yang sangat fleksibel yang tidak memerlukan input CSV; format teks apa pun akan dilakukan, dan ada sejumlah parameter bermanfaat untuk mem-parsing dan memanipulasi data input. Ini jelas merupakan cara tercepat untuk memuat data ke db lokal. Tidak jelas apa yang dimaksud dengan "terbaik" di atas: yaitu apakah kesederhanaan (gunakan pernyataan INSERT) mengalahkan kecepatan (gunakan LOAD DATA).
EdwardGarson

Jawaban:


298

Dari manual MySQL

Masukkan pernyataan yang menggunakan sintaks VALUES dapat menyisipkan beberapa baris. Untuk melakukan ini, sertakan beberapa daftar nilai kolom, masing-masing terlampir di dalam tanda kurung dan dipisahkan dengan koma. Contoh:

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

7
Apakah ini lebih lambat dari Memuat Data Infile?
srchulo

apa sintaksis untuk menulis pernyataan penyisipan ini dalam prosedur tersimpan?
Nitin Sawant

@Nitin bukankah itu sintaks yang sama .. ??? Itu yang akan saya lakukan di SQL Server.
Iklan

13
Harap dicatat bahwa sementara pertanyaan ini berlabel "Bagaimana melakukan batch insert", jawaban ini sebenarnya adalah sisipan massal . Massal biasanya lebih cepat, lihat pertanyaan ini
Mike Demenok

2
@Koffeehaus Per jawaban SO ini dari @Lukman, jumlah nilai / baris yang dapat disisipkan dibatasi olehmax_allowed_packet
Sepster

22

Sebagian besar waktu, Anda tidak bekerja di klien MySQL dan Anda harus memasukkan secara bersamaan menggunakan API yang sesuai.

Misalnya di 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
Entri blog yang bagus tentang sisipan batch (di Jawa, tetapi relevan dengan bahasa apa pun): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

Memuat kueri infil data adalah opsi yang jauh lebih baik tetapi beberapa server seperti godaddy membatasi opsi ini pada shared hosting jadi, hanya dua opsi yang tersisa kemudian satu adalah masukkan catatan pada setiap iterasi atau masukkan batch, tetapi masukkan batch memiliki keterbatasan karakter jika kueri Anda melebihi ini jumlah karakter yang diatur dalam mysql maka permintaan Anda akan macet, Jadi saya sarankan memasukkan data dalam potongan dengan memasukkan batch, ini akan meminimalkan jumlah koneksi yang dibuat dengan database.


1
BagaimanaLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.