MySql Массовая вставка
Я хочу вставить некоторые 4K строки в mysql db. Я не хочу запускать запросы "вставить" 4k. Есть ли способ, с помощью которого я могу запустить только один запрос на вставку для хранения этих 4k строк в db.
Я искал в Интернете, и везде я обнаружил, что пользователи делают массовую вставку в db из файла.
В моем случае у меня есть данные в памяти, и я не хочу сначала записывать эти данные в файл, чтобы делать объемную вставку. Если я это сделаю, я добавлю задержку в программу.
Ответы
Ответ 1
Вы можете написать один 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
Команда MySQL LOAD DATA
может быть вам полезна: http://dev.mysql.com/doc/refman/5.5/en/load-data.html
Что касается предложения Pascal, если ваша команда не превышает max_allowed_packet
, тогда вы должны будете выполнить этот запрос. Во многих случаях он лучше всего подходит для создания нескольких меньших вставок с 1000 строк в каждой.
Ответ 3
Вы можете выполнить ваши заявления в пакетном режиме, здесь можно найти пример кода.
Кроме того, setAutoCommit(false)
и вызовите conn.commit();
после executeBatch()
, чтобы свести к минимуму количество коммитов.
Ответ 4
Вставить объем более 7000000 записей за 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, но мы вычисляем, что и после вставки, что.
Ответ 5
В mySql вы можете использовать load data infile
LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','