我想向 MySql 数据库中插入 4K 行数据,但不想逐行执行 4K 次 'insert' 查询。是否有一种方法可以仅使用一个 'insert' 查询将这 4K 行数据存储到数据库中。
我在网上搜索了一下,发现用户通常是从文件中进行批量插入到数据库的。
而我的情况是,我已经将数据存储在内存中,不想先写入文件再进行批量插入。如果那样做,将会延迟程序执行。
我想向 MySql 数据库中插入 4K 行数据,但不想逐行执行 4K 次 'insert' 查询。是否有一种方法可以仅使用一个 'insert' 查询将这 4K 行数据存储到数据库中。
我在网上搜索了一下,发现用户通常是从文件中进行批量插入到数据库的。
而我的情况是,我已经将数据存储在内存中,不想先写入文件再进行批量插入。如果那样做,将会延迟程序执行。
您可以编写一个单一的 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)
通过我提供的示例,这个单查询语句将在表中插入三行。
LOAD DATA
命令可能对您有用:http://dev.mysql.com/doc/refman/5.5/en/load-data.html
关于Pascal的建议,除非您的命令超过max_allowed_packet
,否则您应该能够执行此查询。在许多情况下,最好创建少量较小的插入,每个插入包含1000行左右。 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文件中,但我们计算后插入了这些值。
LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','