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?
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).
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:
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();
a co z insert into select from wydajnością? czy jest tak szybka jak wkład zbiorczy?
hiway
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
INSERT
obsługuje to natywnie !Odpowiedzi:
Z podręcznika MySQL
źródło
max_allowed_packet
W większości przypadków nie pracujesz w kliencie MySQL i powinieneś zbiorczo wstawiać wstawki za pomocą odpowiedniego interfejsu API.
Np. W JDBC:
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm
źródło
Proszę zapoznać się z dokumentacją MySQL dotyczącą instrukcji INSERT
źródło
insert into select from
wydajnością? czy jest tak szybka jak wkład zbiorczy?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
źródło
LOAD DATA LOCAL INFILE '/users/name/txt.file'
mysql pozwala na wstawienie wielu wierszy na raz INSERT manual
źródło