MySQL - ile wierszy mogę wstawić w jednym poleceniu INSERT?

91

Czy zależy to od liczby zestawów wartości? Czy zależy to od liczby bajtów w instrukcji INSERT?

Luistar15
źródło

Odpowiedzi:

93

Możesz wstawiać nieskończenie dużą liczbę rekordów za pomocą INSERT ... SELECTwzorca, pod warunkiem, że masz te rekordy lub ich część w innych tabelach.

Ale jeśli na stałe kodujesz wartości za pomocą INSERT ... VALUESwzorca, istnieje ograniczenie dotyczące wielkości / długości instrukcji: max_allowed_packet, które ogranicza długość instrukcji SQL wysyłanych przez klienta do serwera bazy danych i ma wpływ na wszystkie typy zapytań i nie tylko dla instrukcji INSERT.

Lukman
źródło
44

Idealnie, MySQL pozwala na tworzenie nieskończonej liczby wierszy w jednym wstawieniu (na raz), ale gdy plik

Klient MySQL lub serwer mysqld otrzymuje pakiet większy niż max_allowed_packet bajtów, generuje błąd Packet too large i zamyka połączenie.

Aby zobaczyć, jaka jest domyślna wartość zmiennej max_allowed_packet, wykonaj następujące polecenie w MySQL:

show variables like 'max_allowed_packet';

Standardowa instalacja MySQL ma domyślną wartość 1048576 bajtów (1 MB). Można to zwiększyć, ustawiając wyższą wartość dla sesji lub połączenia.

To ustawia wartość na 500 MB dla wszystkich (to właśnie oznacza GLOBALNY):

SET GLOBAL max_allowed_packet=524288000;

sprawdź zmianę w nowym terminalu z nowym połączeniem:

show variables like 'max_allowed_packet';

Teraz powinno działać bez żadnego błędu dla nieskończonego wstawiania rekordów. Dzięki

Raju akula
źródło
11
500 MB nie jest nieskończone. Jest znacznie większy niż wartość domyślna, ale nadal nie jest nieskończony.
Carlos2W
Pytanie: po co dokładnie ten limit? Samo zapytanie? A co z danymi powiązanymi podczas wykonywania instrukcji? Czy mogę być bezpieczny, dopóki strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat
Gdybyś próbował ustawić go na największą możliwą wartość, czyli 1 GB, co wyglądałoby tak: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru
23

Zapytanie jest max_allowed_packetogólnie ograniczone .

Dmytro Lytovchenko
źródło
6

Za pomocą jednej instrukcji INSERT można wstawić nieskończoną liczbę wierszy. Na przykład można wykonać procedurę składowaną, w której pętla jest wykonywana tysiące razy, za każdym razem, gdy jest uruchamiane zapytanie INSERT.

Lub twój INSERT może wyzwolić wyzwalacz, który sam wykonuje INSERT. Który uruchamia kolejny wyzwalacz. I tak dalej.

Nie, to nie zależy od liczby zestawów wartości. Nie zależy też od liczby bajtów.

Istnieje ograniczenie co do tego, jak głęboko mogą być zagnieżdżone nawiasy i jak długo trwa całe zestawienie. Jak na ironię, do obu tych odniesień znajduje się strona thedailywtf.com. Jednak oba wymienione powyżej środki pozwalają obejść te ograniczenia.

Borealid
źródło
Twoje przykłady dotyczą uruchamiania wielu instrukcji INSERT i nie pokazują wstawiania wielu wierszy w jednej instrukcji INSERT.
Lukman
@Lukman: Jedno zapytanie INSERT może spowodować, że do bazy danych trafi wiele INSERTÓW. To tylko kwestia tego, kto co liczy.
Borealid
2
To prawda, ale Twój pierwszy przykład pokazuje uruchamianie zapytania w pętli z każdą pętlą wykonującą jedną instrukcję INSERT i nie mówi nic o tej jednej instrukcji INSERT wstawiającej wiele wierszy. to tylko kwestia nacisku.
Lukman
Nikt nie może zrobić niczego nieskończonego. Zawsze istnieją limity zasobów.
Adrien
Czy dotyczy to również instrukcji SELECT ... FROM? Chodzi mi o to, że jeśli dane zostały wstawione na pierwszym miejscu z max_allowed_packet, czy nie powinno to być również zaznaczone po tym? Nie rozumiem, dlaczego jest stosowany do wszystkich innych stwierdzeń, tak jak powiedział inny plakat, kiedy i tak trzeba go najpierw wstawić przed czymkolwiek innym.
Thielicious
2

Wydaje mi się, że nie ma zdefiniowanej liczby wierszy, które można wstawić na WSTAWIENIE, ale ogólnie może istnieć jakiś maksymalny rozmiar zapytań.

DMags
źródło
2

Jest ograniczony przez max_allowed_packet.
Możesz określić używając: mysqld --max_allowed_packet=32M Domyślnie jest to 16M.
Możesz również określić w my.cnf w / etc / mysql /

linehrr
źródło