Wstawianie wielu wierszy w mysql

349

Czy zapytanie bazy danych jest szybsze, jeśli wstawię wiele wierszy jednocześnie:

lubić

INSERT....

UNION

INSERT....

UNION

(Muszę wstawić jak 2-3000 wierszy)

Emma
źródło
8
UNION jest dla wybranych.
Jacob
1
Jak idą rzędy? Czy piszesz bezpośrednio SQL w przeglądarce zapytań MySQL, czy używasz PHP lub C # lub czegoś innego? Jeśli zmieścisz się w tym drugim przypadku, sprawdź następujące linki: Najszybszy sposób na wstawienie 100
000

Odpowiedzi:

1176

INSERTinstrukcje korzystające ze VALUESskładni mogą wstawiać wiele wierszy. Aby to zrobić, dołącz wiele list wartości kolumn, każda zamknięta w nawiasach i oddzielona przecinkami.

Przykład:

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

Źródło

Nicola Cossu
źródło
@RPK. Zgadzam się z tobą, ale nie znam jej źródła danych. Jak już pisałem, jeśli ona ma plik, użyłbym składni danych ładowania, jak sugeruje cularis. :)
Nicola Cossu
możliwe jest również użycie INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. oczywiście będzie to lepsze, ponieważ wstawione wartości pochodzą z różnych tabel.
Zohar Peled
72
Pomocne odniesienie, ponieważ czasami po prostu zapominam o prostej składni.
Kapitan Hypertext
czy zmienne tymczasowe a, b i c przechowują tutaj zawartość wierszy?
Lealo,
3
@Lealo nie, są to nazwy kolumn tabeli, w których należy wstawić wartości w tej samej kolejności.
BeetleJuice
60

Jeśli masz swoje dane w pliku tekstowym, możesz użyć LOAD DATA INFILE .

Podczas ładowania tabeli z pliku tekstowego użyj LOAD DATA INFILE. Zazwyczaj jest to 20 razy szybciej niż przy użyciu instrukcji INSERT.

Optymalizacja instrukcji INSERT

Więcej wskazówek dotyczących przyspieszenia instrukcji wstawiania można znaleźć pod powyższym linkiem.

Jakub
źródło
3
Co ze zduplikowanymi rekordami?
Matteo,
2
@Matteo Duplikaty zostaną wstawione lub odrzucone przez bazę danych na podstawie zdefiniowanego przez Ciebie schematu.
ankush981,
Skorzystaj z wielu zapytań mysql
Francisco Yepes Barrera
1
Drugi link 404.
dimir
1
Zepsuty link „Szybkość wstawiania instrukcji” jest teraz uwzględniony w: Optymalizowanie instrukcji INSERT .
Kenneth M. Kolano
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
źródło
3
To zasługuje na więcej pozytywnych opinii, dzięki temu możesz zbiorczo wstawiać dane pobrane z innych tabel
Novastorm
4
Gdyby tylko istniało wyjaśnienie tego, co dzieje się w tym fragmencie kodu, biorąc pod uwagę, że muszę „masowo wstawiać dane pobrane z innych tabel” ...
Aleister Tanek JavaScript Mraz
0

Oto rozwiązanie PHP gotowe do użycia z tabelą: m (relacja wiele do wielu):

// 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
źródło
Użycie implode () pozwala obejść problem „ostatniego znaku”, ale powoduje ogromne obciążenie pamięci. Poprosiła o 3000 wierszy, wyobraź sobie, że każdy wiersz ma 1kb danych, to już 3 MB surowych danych. Tablica zajmie 30 MB pamięci, którą zużywa już 30 MB z $ table_1, więc skrypt użyje 60 MB. Mówiąc inaczej, w przeciwnym razie jest to dobre rozwiązanie
John
jest to przydatne w mojej sytuacji.
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')";
Johirulla
źródło
Oprócz niejasności tej odpowiedzi, możesz również być podatny na wstrzykiwanie SQL, zakładając, że używasz PHP.
ultrafez
2
1. W twoim kodzie SQL jest błąd. 2. Następna wartość $ sql zastąpi poprzednią wartość $ sql.
Marwan Salim