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)


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


@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.


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;

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));

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')";

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.