Czy zależy to od liczby zestawów wartości? Czy zależy to od liczby bajtów w instrukcji INSERT?
Odpowiedzi:
Możesz wstawiać nieskończenie dużą liczbę rekordów za pomocą INSERT ... SELECT
wzorca, pod warunkiem, że masz te rekordy lub ich część w innych tabelach.
Ale jeśli na stałe kodujesz wartości za pomocą INSERT ... VALUES
wzorca, 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.
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
strlen($query_with_questionmarks) < $max_alloweed_packet
?
Zapytanie jest max_allowed_packet
ogólnie ograniczone .
patrz http://forums.mysql.com/read.php?20,161869 , jest to związane z konfiguracją Twojego MySQL: max_allowed_packet
, bulk_insert_buffer_size
, key_buffer_size
.
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.
Osiągniesz limit max_allowed_packet i
błąd: 1390 Przygotowana instrukcja zawiera zbyt wiele symboli zastępczych.
Możesz umieścić 65535 symboli zastępczych w jednym sql, więc jeśli masz dwie kolumny w jednym wierszu, możesz wstawić 32767 wierszy w jednym sql.