我想在MySql数据库中插入一些4K行。我不想解雇4k'插入'查询。有没有什么办法可以只触发一个插入查询来存储db中的那些4k行。
我在互联网和任何地方搜索,我发现用户正在从文件中批量插入数据库。
在我的情况下,我有内存中的数据,我不想先将该数据写入文件进行批量插入。如果我这样做,那么我将在程序中添加延迟。
答案 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 batch,some code example can be found here。
另外,setAutoCommit(false)
,并在conn.commit();
之后调用executeBatch()
以最小化提交次数。
答案 3 :(得分:1)
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 ','