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

350

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

как

INSERT....

UNION

INSERT....

UNION

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

Показать ещё 1 комментарий
Теги:
sql-insert

6 ответов

1034
Лучший ответ
Операторы

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

Пример:

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

Источник

  • 10
    Это можно сделать таким образом, но он хочет вставить 3000 строк.
  • 0
    @RPK. Я согласен с вами, но я не знаю ее источника данных. Как я уже писал, если бы у нее был файл, я бы использовал синтаксис загрузки данных, как подсказывает cularis. :)
Показать ещё 5 комментариев
50

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

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

Оптимизация заявлений INSERT

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

  • 3
    Как насчет дублированных записей?
  • 2
    @Matteo Дубликаты будут либо вставлены, либо отклонены базой данных на основе определенной вами схемы.
Показать ещё 3 комментария
13

Вы можете вставить столько строк, сколько с этим script.

INSERT INTO tableName
    (column1,column2,column3,column4)
VALUES
    ('value1' , 'value2', 'value3','value4'),
    ('value1' , 'value2', 'value3','value4'),
    ('value1' , 'value2', 'value3','value4');
12
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;
  • 2
    Это заслуживает большего количества голосов, используя это, вы можете массово вставить данные, полученные из других таблиц
-2

Вот PHP-решение, готовое для использования с таблицей n: 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));
  • 0
    Использование implode () позволяет обойти проблему «последнего символа», но создает огромные накладные расходы памяти. Она попросила 3000 строк, представьте, что каждая строка содержит 1 КБ данных, это уже 3 МБ необработанных данных. Массив займет 30 МБ памяти, она уже потребляет еще 30 МБ из $ table_1, поэтому сценарий будет использовать 60 МБ. Просто говорю, иначе это хорошее решение
-6
// 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')";
  • 11
    Чего ждать?
  • 0
    Помимо запутанности этого ответа, вы также можете быть уязвимы для SQL-инъекций, если вы используете PHP.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню