Вставка декількох рядків у mysql


349

Чи швидше запит до бази даних, якщо я вставляю відразу кілька рядків:

подібно до

INSERT....

UNION

INSERT....

UNION

(Мені потрібно вставити як 2-3000 рядків)


8
UNION призначений для обраних.
Яків

1
Як виходять ряди? Ви безпосередньо пишете SQL в браузері запитів MySQL або використовуєте всередині PHP або C # або щось інше. Якщо ви підходите до останнього випадку, перевірте наступні посилання: Найшвидший спосіб вставити 100-
кратні

Відповіді:


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 ні, це назви стовпців таблиці, в які слід вставити значення в одному порядку.
BeetleJuice

60

Якщо ви маєте свої дані в текстовому файлі, ви можете використовувати ЗАВАНТАЖЕННЯ ДАНИХ ІНФІЛЮ .

Завантажуючи таблицю з текстового файлу, використовуйте ЗАВАНТАЖЕННЯ ДОДАТОК INFILE. Зазвичай це в 20 разів швидше, ніж використання тверджень INSERT.

Оптимізація виписок INSERT

Ви можете знайти більше порад, як пришвидшити вкладення заявок за посиланням вище.


3
Що щодо дублюваних записів?
Маттео

2
@Matteo Дублікати будуть вставлені або відхилені базою даних на основі визначеної вами схеми.
ankush981

Використовуйте запитання mysql
Франциско Йепес Баррера

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
Якби тільки було пояснення щодо того, що відбувається в цьому фрагменті коду, враховуючи, що я маю "масово вставляти дані, отримані з інших таблиць" ...
Aleister Tanek Javas Mraz

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 МБ. Просто кажу, інакше це вдале рішення
Джон

це корисно для моєї ситуації.
Bilal Şimşek

-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.
ультрафез

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