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?

Genadinik
sumber
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);
nietaki
sumber
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

Kamran
sumber
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
8
Insert into table(col1,col2) select col1,col2 from table_2;

Silakan merujuk ke dokumentasi MySQL pada Pernyataan INSERT

Tuan Lou
sumber
bagaimana dengan insert into select from kinerja? apakah itu secepat memasukkan massal?
hiway
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.

Syed Adeel Ali Rizvi
sumber
1
BagaimanaLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j
3

mysql memungkinkan Anda untuk memasukkan banyak baris sekaligus. INSERT manual

bensiu
sumber