Как выполнить пакетную вставку в MySQL


152

У меня есть одно-много записей, которые нужно ввести в таблицу. Как лучше всего сделать это в запросе? Должен ли я просто сделать цикл и вставлять по одной записи на итерацию? Или есть способ лучше?


1
Пожалуйста, прочтите документацию для оператора или функции, прежде чем пытаться их использовать. INSERTподдерживает это изначально !
Гонки легкости на орбите

3
Если у вас действительно большое количество записей и вы можете отформатировать их как файл CSV, ознакомьтесь с оператором LOAD DATA INFILE или командой mysqlimport.
squawknull

Для записи: ЗАГРУЗИТЬ ДАННЫЕ - очень гибкая команда, не требующая ввода CSV; подойдет любой текстовый формат, и есть ряд полезных параметров для анализа и управления входными данными. Это определенно самый быстрый способ загрузки данных в локальную базу данных. Непонятно, что имеется в виду под словом «лучший» выше: то есть, превосходит ли простота (используйте инструкции INSERT) скорость (используйте LOAD DATA).
Эдвард Гарсон,

Ответы:


307

Из руководства MySQL

Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в круглые скобки и разделен запятыми. Пример:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

7
Это медленнее, чем загрузка файла данных?
srchulo 06

каков синтаксис для записи этого оператора вставки в хранимую процедуру?
Nitin S

@Nitin, разве это не тот же синтаксис .. ??? В любом случае я бы так поступил в SQL Server.
Реклама

13
Обратите внимание, что, хотя вопрос помечен как «Как выполнять пакетную вставку», на самом деле это массовая вставка. Bulk обычно быстрее, см. Этот вопрос
Майк Деменок

2
@Koffeehaus Согласно этому SO-ответу от @Lukman, количество значений / строк, которые могут быть вставлены, ограниченоmax_allowed_packet
Sepster

23

В большинстве случаев вы не работаете в клиенте MySQL, и вам следует группировать вставки вместе, используя соответствующий API.

Например, в JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
Хорошая запись в блоге о пакетных вставках (на Java, но актуальна для любого языка): viralpatel.net/blogs/batch-insert-in-java-jdbc
Кангур


6

Запрос загрузки данных в файл - намного лучший вариант, но некоторые серверы, такие как godaddy, ограничивают эту опцию на общем хостинге, поэтому осталось только два варианта, затем одна - вставка записи на каждой итерации или пакетной вставке, но пакетная вставка имеет ограничение на количество символов, если ваш запрос превышает это количество символов, установленных в mysql, тогда ваш запрос выйдет из строя, поэтому я предлагаю вставлять данные в блоки с помощью пакетной вставки, это минимизирует количество подключений, установленных с базой данных. удачи, ребята


1
Как насчетLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.