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?

Genadinik
źródło
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);
nietaki
źródło
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

Kamran
źródło
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

Syed Adeel Ali Rizvi
źródło
1
Co powiesz naLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j