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

349

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

подобно

INSERT....

UNION

INSERT....

UNION

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

Эмма
источник
8
СОЮЗ для избранных.
Джейкоб
1
Как идут строки? Вы непосредственно пишете SQL в MySQL Query Browser или используете изнутри PHP или C # или что-то еще. Если вы подходите в последнем случае, проверьте следующие ссылки: Самый быстрый способ вставки 100k записей быстрых вставок с несколькими
строками
Исправлена ​​вторая ссылка: Оптимизация запросов MySQL - Быстрые вставки с несколькими
строками

Ответы:

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;
sunilsingh
источник
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));
Meloman
источник
Использование 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')";
Johirulla
источник
Помимо запутанности этого ответа, вы также можете быть уязвимы для внедрения SQL, если вы используете PHP.
ultrafez
2
1. В вашем коде SQL есть ошибка. 2. Следующее значение $ sql заменит предыдущее значение $ sql.
Марван Салим