Reputation: 34725
I want to insert some 4K rows in the MySql db. I don't want to fire 4k 'insert' queries. Is there any way by which I can fire only one insert query to store those 4k rows in the db.
I searched on internet and everywhere I found that the users are doing bulk insert into the db from a file.
In my case, I have the data in the memory and I don't want to first write that data to a file to do bulk insert. If I do that then I will add delay in the program.
Upvotes: 10
Views: 24053
Reputation: 427
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 and RRP_nl and RRP_bl is not in csv but we are calculated that and after insert that.
Upvotes: 2
Reputation: 300
In mySql you can use load data infile
LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','
Upvotes: 0
Reputation: 1854
You can execute your statements in batch, some code example can be found here.
Also, setAutoCommit(false)
, and call conn.commit();
after executeBatch()
to minimise the number of commits.
Upvotes: 6
Reputation: 14149
MySQL's LOAD DATA
command might be useful to you: http://dev.mysql.com/doc/refman/5.5/en/load-data.html
With reference to Pascal's suggestion unless your command exceeds max_allowed_packet
then you should be able to execute this query. In many cases it works best to create few smaller inserts with say 1000 rows in each.
Upvotes: 8
Reputation: 400932
You could write a single insert
query that would do several inserts in a single call to the database :
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)
Here, with the example I've given, this single query would have inserted three rows in the table.
Upvotes: 16