2011-07-31 23 views
338

jest zapytanie do bazy danych szybciej, jeśli wstawić wiele wierszy naraz:Wstawianie wielu wierszy w mysql

jak

INSERT.... 

UNION 

INSERT.... 

UNION 

(Muszę wstawić jak 2-3000 wierszy)

+8

UNION dla wybiera. – Jacob

+1

Jak nadchodzą rzędy? Czy piszesz bezpośrednio SQL na MySQL Query Browser lub używając wewnątrz PHP lub C# lub czegoś innego. Jeśli pasujesz do tego ostatniego przypadku, sprawdź następujące linki: [Najszybsza metoda wstawiania rekordów 100k] (http://codicesoftware.blogspot.com/2008/04/fastest-way-to-insert-100k-registers.html) [Fast Inserts with Multiple Rows] (http://blog.cnizz.com/2010/05/31/optimize-mysql-queries-fast-mutliple-row-inserts/) – RKh

Odpowiedz

806

INSERT instrukcje, które używają składni VALUES, 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); 

Source

+8

Można to zrobić w ten sposób, ale on chce wstawić 3000 wierszy. – RKh

+0

@RPK. Zgadzam się z tobą, ale nie znam jej źródła danych. Jak już napisałem, jeśli ma plik, użyłbym składni danych obciążenia, jak sugeruje cularis. :) –

+0

można również użyć 'INSERT INTO Tabela SELECT 1, '14/05/2012 ', 3 UNION SELECT 2, '05/14/2012', 3'. oczywiście będzie to tylko lepsze z wprowadzonych wartości pochodzących z różnych tabel. –

42

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

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

Optimizing INSERT Statements

Można znaleźć więcej wskazówek, jak przyspieszyć instrukcje wstawiania na link powyżej.

+3

Co ze zduplikowanymi rekordami? – Matteo

+2

@Matteo Duplikaty będą wstawiane lub odrzucane przez bazę danych na podstawie zdefiniowanego schematu. – dotslash

+0

Użyj wielowątkowości mysql –

16

Za pomocą tego skryptu można wstawić dowolną liczbę wierszy.

INSERT INTO tableName 
    (column1,column2,column3,column4) 
VALUES 
    ('value1' , 'value2', 'value3','value4'), 
    ('value1' , 'value2', 'value3','value4'), 
    ('value1' , 'value2', 'value3','value4'); 
+29

Jak to się poprawia po odpowiedzi Nicoli Cossu sprzed pięciu lat? – John

+6

Czy jesteś Nicola Cossu? – lalithkumar

5
BEGIN; 
INSERT INTO test_b (price_sum) 
    SELECT price 
    FROM test_a; 
INSERT INTO test_c (price_summ) 
    SELECT price 
FROM test_a; 
COMMIT; 
+0

To zasługuje na więcej upvotes, korzystając z tego można wstawić dane wstawione z innych tabel – Novastorm

-1
// 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')"; 
+4

Czekaj, .... co? – proofzy

0

Oto PHP roztwór gotowy do użycia o n M (wiele-do-wielu) Tabela:

// 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

Użycie metody implode() powoduje obejście problemu "ostatniego znaku", ale powoduje ogromne obciążenie pamięci. Zapytała o 3000 wierszy, wyobraź sobie, że każdy wiersz ma 1kb danych, to już 3MB surowych danych. Tablica zajmie 30MB pamięci, która już zużyje kolejne 30MB z $ table_1, więc skrypt użyje 60MB. Po prostu mówię, w przeciwnym razie jest to dobre rozwiązanie – John

Powiązane problemy