Як зробити пакетну вставку в MySQL


148

У мене є 1-багато записів, які потрібно внести до таблиці. Який найкращий спосіб зробити це у запиті? Чи варто просто зробити цикл і вставити один запис за ітерацію? Або є кращий спосіб?


1
Будь ласка, прочитайте документацію для твердження або функції, перш ніж намагатися його використовувати. INSERTпідтримує це споконвічно !
Гонки легкості на орбіті

3
Якщо у вас дійсно велика кількість записів і ви можете відформатувати їх у вигляді файлу CSV, перегляньте оператор LOAD DATA INFILE або команду mysqlimport.
squawknull

Для запису LOAD DATA - це дуже гнучка команда, яка не потребує введення CSV; будь-який текстовий формат буде виконаний, і є ряд корисних параметрів для розбору та маніпулювання вхідними даними. Це, безумовно, найшвидший спосіб завантаження даних у локальний db. Незрозуміло, що мається на увазі під «найкращим» вище: тобто чи простота (використання тверджень INSERT) козиряє швидкість (використовуйте ЗАВАНТАЖЕНІ ДАНІ).
EdwardGarson

Відповіді:


298

З посібника MySQL

Вкладиші INSERT, які використовують синтаксис VALUES, можуть вставляти кілька рядків. Для цього включіть декілька списків значень стовпців, кожен укладений у круглі дужки та розділений комами. Приклад:

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

7
Це повільніше, ніж завантажувати дані файлу?
srchulo

що таке синтаксис для написання цього вкладеного оператора у збережену процедуру?
Нітін Соант

@Nitin, чи не був би той самий синтаксис .. ??? Ось що я б робив у SQL Server у будь-якому випадку.
Оголошення

13
Зауважте, що хоча питання позначено "Як робити пакетні вставки", ця відповідь насправді є масовою вставкою. Навальне, як правило, швидше, дивіться це запитання
Майк Деменок

2
@Koffeehaus За цією відповіддю від @Lukman кількість значень / рядків, які можна вставити, обмеженоmax_allowed_packet
Sepster

22

Більшу частину часу ви не працюєте в клієнті 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
Kangur


6

Запит запиту на завантаження даних є набагато кращим варіантом, але деякі сервери, такі як godaddy, обмежують цю опцію на спільному хостингу, тому залишається лише два варіанти, тоді один - вставка запису на кожну ітерацію або пакетну вставку, але пакетна вставка має обмеження символів, якщо ваш запит перевищує це кількість символів, встановлених у mysql, тоді ваш запит завершиться, тому я пропоную вставляти дані в шматки з пакетною вставкою, це зведе до мінімуму кількість з'єднань, встановлених з database.best удачі хлопців


1
Як щодоLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.