Jika anda memiliki ribuan record misalnya dari table lain untuk di insert ke dalam sebuah table MySQL maka biasanya cara dilakukan adalah dengan looping seperti ini :
while not rs1.eof do begin
rs2.insert;
rs2.FieldByName('field1').AsString := rs1.FieldByName('field1').AsString;
rs2.FieldByName('field2').AsString := rs1.FieldByName('field2').AsString;
rs2.Post;
rs1.Next;
end
Tidak ada yang salah dengan kode di atas, tapi cobalah insert dengan lebih dari 10.000 record, maka proses akan terasa sangat lambat.
MySQL mendukung insert banyak record dengan 1 statement seperti ini :
INSERT INTO table VALUES('value1','value'), ('value1','value2'), ('value1','value2'), dst
Dengan menggunakan kelebihan tersebut berikut contoh coding untuk insert ribuan data ke dalam mysql :
Asumsi : koneksi dan query ke database menggunakan komponen ZEOLib
(http://sourceforge.net/projects/zeoslib/)
var
sSQL: WideString;
i: integer;
rs1: TZQuery;
begin
rs1 := TZQuery.Create(nil);
rs1.SQL.Text := 'SELECT * FROM table1';
rs1.Connection := dm.zConn;
rs1.Open;
i := 1;
sSQL := 'INSERT INTO table2 VALUES';
while not rs1.eof do begin
sSQL := sSQL + Format('(''%s'', ''%s''),',
[rs1.FieldByName('field1').AsString, rs1.FieldByName('field2').AsString]);
rs1.Next;
inc(i);
if i = 10000 then begin
sSQL := Copy(sSQL,1,Length(sSQL)-1) + ';'; //utk menghilangkan , di belakang
try
dm.zConn.ExecuteDirect(sSQL);
except
end;
sSQL := 'INSERT INTO table2 VALUES'; // kembalikan sSQL ke awal
i := 1;
end;
end;
end;
Pada kode diatas, setiap 10.000 record statement SQL akan dijalankan, pengalaman penulis jika statement lebih dari 10.000 dan statement dijalankan akan menimbulkan error.
Kode seperti ini saya gunakan di program POS dan DPT yang saya buat.
Semoga bermanfaat.

