Jak wstawić wsad w MySQL


148

Mam od 1 do wielu rekordów, które należy wprowadzić do tabeli. Jaki jest najlepszy sposób zrobienia tego w zapytaniu? Czy powinienem po prostu zrobić pętlę i wstawić jeden rekord na iterację? Czy jest jakiś lepszy sposób?


1
Przeczytaj dokumentację instrukcji lub funkcji przed próbą ich użycia. INSERTobsługuje to natywnie !
Wyścigi lekkości na orbicie

3
Jeśli masz naprawdę dużą liczbę rekordów i możesz je sformatować jako plik CSV, sprawdź instrukcję LOAD DATA INFILE lub polecenie mysqlimport.
squawknull

Dla przypomnienia , LOAD DATA jest bardzo elastycznym poleceniem, które nie wymaga danych wejściowych CSV; wystarczy dowolny format tekstowy i istnieje wiele pomocnych parametrów do analizowania i manipulowania danymi wejściowymi. Jest to zdecydowanie najszybszy sposób na załadowanie danych do lokalnej bazy danych. Nie jest jasne, co rozumie się powyżej przez „najlepsze”: tj. Czy prostota (użyj instrukcji INSERT) przewyższa szybkość (użyj LOAD DATA).
Edward Garson

Odpowiedzi:


298

Z podręcznika MySQL

Instrukcje INSERT używające składni VALUES mogą wstawiać wiele wierszy. Aby to zrobić, uwzględnij wiele list wartości kolumn, każdą umieszczoną w nawiasach i oddzieloną przecinkami. Przykład:

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

7
Czy jest to wolniejsze niż Load Data Infile?
srchulo

Jaka jest składnia zapisu tej instrukcji wstawiania w procedurze składowanej?
Nitin Sawant

@Nitin nie byłaby to ta sama składnia .. ??? Tak czy inaczej zrobiłbym w SQL Server.
Reklamy

13
Należy pamiętać, że pytanie jest oznaczony „Jak zrobić wsadowych wkładki” ta odpowiedź jest rzeczywiście bulk insert. Bulk jest zwykle szybszy, zobacz to pytanie
Mike Demenok

2
@Koffeehaus Zgodnie z tą odpowiedzią SO od @Lukman, liczba wartości / wierszy, które można wstawić, jest ograniczona przezmax_allowed_packet
Sepster

22

W większości przypadków nie pracujesz w kliencie MySQL i powinieneś zbiorczo wstawiać wstawki za pomocą odpowiedniego interfejsu API.

Np. W JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
Dobry wpis na blogu na temat wstawiania wsadowego (w Javie, ale jest odpowiedni dla każdego języka): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

Zapytanie o załadowanie danych jest znacznie lepszą opcją, ale niektóre serwery, takie jak GoDaddy, ograniczają tę opcję do hostingu współdzielonego, więc pozostały tylko dwie opcje, a następnie jedna to wstawianie rekordu przy każdej iteracji lub wstawianiu wsadowym, ale wstawianie wsadowe ma ograniczenie znaków, jeśli zapytanie przekracza tę wartość liczba znaków ustawionych w mysql to twoje zapytanie ulegnie awarii, więc sugeruję wstawianie danych w kawałkach za pomocą wstawiania wsadowego, co zminimalizuje liczbę połączeń nawiązanych z bazą danych. powodzenia chłopaki


1
Co powiesz naLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

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.