MySql批量插入

时间:2011-04-03 12:19:14

标签: java mysql bulkinsert

我想在MySql数据库中插入一些4K行。我不想解雇4k'插入'查询。有没有什么办法可以只触发一个插入查询来存储db中的那些4k行。

我在互联网和任何地方搜索,我发现用户正在从文件中批量插入数据库。

在我的情况下,我有内存中的数据,我不想先将该数据写入文件进行批量插入。如果我这样做,那么我将在程序中添加延迟。

5 个答案:

答案 0 :(得分:16)

您可以编写单个insert查询,在一次调用数据库时执行多次插入:

insert into your_table (field1, field2, field3)
values 
  (value1_1, value1_2, value1_3), 
  (value2_1, value2_2, value2_3), 
  (value3_1, value3_2, value3_3)


在这里,通过我给出的示例,这个单个查询将在表中插入三行。

答案 1 :(得分:8)

MySQL的LOAD DATA命令可能对您有用:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

除非您的命令超过max_allowed_packet,否则参考Pascal的建议,您应该能够执行此查询。在许多情况下,最好创建几个较小的插入,每个插入1000行。

答案 2 :(得分:6)

您可以execute your statements in batchsome code example can be found here

另外,setAutoCommit(false),并在conn.commit();之后调用executeBatch()以最小化提交次数。

答案 3 :(得分:1)

在数据库中以1分钟为单位插入超过7000000条记录(计算超高速查询)

    mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ')or die(mysqli_error());
    $affected = (int) (mysqli_affected_rows($cons))-1; 
    $log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP和RRP_nl以及RRP_bl不在csv中,但是在插入之后我们计算出来。

答案 4 :(得分:0)

在mySql中,您可以使用加载数据infile

LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','
相关问题