Вставка нескольких строк в MySQL


349

Будет ли запрос к базе данных быстрее, если я вставлю несколько строк одновременно:

подобно

INSERT....

UNION

INSERT....

UNION

(Мне нужно вставить как 2-3000 строк)


8
СОЮЗ для избранных.
Джейкоб

1
Как идут строки? Вы непосредственно пишете SQL в MySQL Query Browser или используете изнутри PHP или C # или что-то еще. Если вы подходите в последнем случае, проверьте следующие ссылки: Самый быстрый способ вставки 100k записей быстрых вставок с несколькими
строками

Ответы:


1176

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

Пример:

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

Источник


@RPK. Я согласен с вами, но я не знаю ее источника данных. Как я уже писал, если бы у нее был файл, я бы использовал синтаксис загрузки данных, как подсказывает cularis. :)
Никола Коссу

также возможно использовать INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. конечно, это будет только лучше, если вставленные значения поступают из разных таблиц.
Зохар Пелед

72
Полезные ссылки, потому что иногда я просто забываю простой синтаксис.
Капитан Гипертекст

a, b и c здесь временные переменные, хранящие содержимое строк?
Лало

3
@Lealo no, это имена столбцов таблицы, в которые нужно вставлять значения в том же порядке.
BeetleJuice

60

Если у вас есть ваши данные в текстовом файле, вы можете использовать LOAD DATA INFILE .

При загрузке таблицы из текстового файла используйте LOAD DATA INFILE. Обычно это в 20 раз быстрее, чем использование операторов INSERT.

Оптимизация операторов INSERT

Вы можете найти больше советов о том, как ускорить вставку выписок по ссылке выше.


3
Как насчет дублированных записей?
Маттео

2
@Matteo Дубликаты будут либо вставлены, либо отклонены базой данных на основе определенной вами схемы.
ankush981

Используйте mysql multiqueries
Франциско Йепес Баррера

1
Вторая ссылка 404.
Димир

1
Неработающая ссылка «Операторы скорости вставки» теперь рассматривается в: Оптимизация операторов INSERT .
Кеннет М. Колано

27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

3
Это заслуживает большего количества голосов, с помощью которого вы можете массово вставить данные, полученные из других таблиц
Novastorm

4
Если бы только было объяснение того, что происходит в этом фрагменте кода, учитывая, что я должен «массово вставить данные, извлеченные из других таблиц» ...
Алистер Танек Явас Мраз

0

Вот PHP-решение, готовое к использованию с таблицей: m (отношение многие-ко-многим):

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));

Использование implode () позволяет обойти проблему «последнего символа», но создает огромные накладные расходы памяти. Она попросила 3000 строк, представьте, что каждая строка содержит 1 КБ данных, это уже 3 МБ необработанных данных. Массив займет 30 МБ памяти, она уже потребляет еще 30 МБ из $ table_1, поэтому сценарий будет использовать 60 МБ. Просто говоря, в противном случае это хорошее решение
Джон

это полезно для моей ситуации.
Билал Шимшек

-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";

Помимо запутанности этого ответа, вы также можете быть уязвимы для внедрения SQL, если вы используете PHP.
ultrafez

2
1. В вашем коде SQL есть ошибка. 2. Следующее значение $ sql заменит предыдущее значение $ sql.
Марван Салим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.