MySQL批量插入

10

我想向 MySql 数据库中插入 4K 行数据,但不想逐行执行 4K 次 'insert' 查询。是否有一种方法可以仅使用一个 'insert' 查询将这 4K 行数据存储到数据库中。

我在网上搜索了一下,发现用户通常是从文件中进行批量插入到数据库的。

而我的情况是,我已经将数据存储在内存中,不想先写入文件再进行批量插入。如果那样做,将会延迟程序执行。

5个回答

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)


通过我提供的示例,这个单查询语句将在表中插入三行。


2
我认为数据库对查询长度设置了一些限制。如果只有3行,那么它可以工作,但如果有4K行,我不认为它会工作。 - Amit
当我尝试插入1000行(8个整数,2个字符串)时,这对我有效。但是当我尝试2000行时,出现了“MySQL服务器已断开连接”的错误。为了解决这个问题,我将尝试像James C建议的那样每次插入1000行。 - Nick Bolton
@Pascal 这是原子性的吗?如果数据库在一半崩溃,只插入了三行中的两行,这种情况可能发生吗? - Pacerier
@YatendraGoel:你仍然可以将单个元素插入的集合分区为n-(4K/n)-元素插入。 - Sebastian Mach

8
MySQL的LOAD DATA命令可能对您有用:http://dev.mysql.com/doc/refman/5.5/en/load-data.html 关于Pascal的建议,除非您的命令超过max_allowed_packet,否则您应该能够执行此查询。在许多情况下,最好创建少量较小的插入,每个插入包含1000行左右。

6

您可以使用批处理执行语句,这里有相关说明,这里提供了一些代码示例。

此外,为减少提交的次数,需要在 executeBatch() 后调用 conn.commit(); 前设置 setAutoCommit(false)


2

在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文件中,但我们计算后插入了这些值。


0
在mySql中,您可以使用load data infile。
LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接