У меня есть одно-много записей, которые нужно ввести в таблицу. Как лучше всего сделать это в запросе? Должен ли я просто сделать цикл и вставлять по одной записи на итерацию? Или есть способ лучше?
Пожалуйста, прочтите документацию для оператора или функции, прежде чем пытаться их использовать. INSERTподдерживает это изначально !
Гонки легкости на орбите
3
Если у вас действительно большое количество записей и вы можете отформатировать их как файл CSV, ознакомьтесь с оператором LOAD DATA INFILE или командой mysqlimport.
squawknull
Для записи: ЗАГРУЗИТЬ ДАННЫЕ - очень гибкая команда, не требующая ввода CSV; подойдет любой текстовый формат, и есть ряд полезных параметров для анализа и управления входными данными. Это определенно самый быстрый способ загрузки данных в локальную базу данных. Непонятно, что имеется в виду под словом «лучший» выше: то есть, превосходит ли простота (используйте инструкции INSERT) скорость (используйте LOAD DATA).
Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в круглые скобки и разделен запятыми. Пример:
каков синтаксис для записи этого оператора вставки в хранимую процедуру?
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();
как насчет insert into select from производительности? это так же быстро, как объемная вставка?
hiway
6
Запрос загрузки данных в файл - намного лучший вариант, но некоторые серверы, такие как godaddy, ограничивают эту опцию на общем хостинге, поэтому осталось только два варианта, затем одна - вставка записи на каждой итерации или пакетной вставке, но пакетная вставка имеет ограничение на количество символов, если ваш запрос превышает это количество символов, установленных в mysql, тогда ваш запрос выйдет из строя, поэтому я предлагаю вставлять данные в блоки с помощью пакетной вставки, это минимизирует количество подключений, установленных с базой данных. удачи, ребята
INSERT
поддерживает это изначально !Ответы:
Из руководства MySQL
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
источник
max_allowed_packet
В большинстве случаев вы не работаете в клиенте 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
источник
Insert into table(col1,col2) select col1,col2 from table_2;
См. Документацию MySQL по инструкции INSERT.
источник
insert into select from
производительности? это так же быстро, как объемная вставка?Запрос загрузки данных в файл - намного лучший вариант, но некоторые серверы, такие как godaddy, ограничивают эту опцию на общем хостинге, поэтому осталось только два варианта, затем одна - вставка записи на каждой итерации или пакетной вставке, но пакетная вставка имеет ограничение на количество символов, если ваш запрос превышает это количество символов, установленных в mysql, тогда ваш запрос выйдет из строя, поэтому я предлагаю вставлять данные в блоки с помощью пакетной вставки, это минимизирует количество подключений, установленных с базой данных. удачи, ребята
источник
LOAD DATA LOCAL INFILE '/users/name/txt.file'
mysql позволяет вставлять сразу несколько строк INSERT manual
источник