MySQL - сколько строк я могу вставить в один оператор INSERT? - PullRequest
78 голосов
/ 21 августа 2010

Зависит ли это от количества наборов значений? Зависит ли это от количества байтов в операторе INSERT?

Ответы [ 8 ]

86 голосов
/ 21 августа 2010

Вы можете вставлять бесконечно большое количество записей, используя шаблон INSERT ... SELECT, если у вас есть эти записи или их часть в других таблицах.

Но если вы жестко кодируете значения, используя шаблон INSERT ... VALUES, тогда существует ограничение на то, насколько велика / длинна ваша инструкция: max_allowed_packet , которая ограничивает длину операторов SQL, отправляемых клиентом. к серверу базы данных, и это влияет на любые типы запросов, а не только для оператора INSERT.

34 голосов
/ 09 января 2015

В идеале, Mysql позволяет создавать бесконечное количество строк в одной вставке (за один раз), но когда

Клиент MySQL или сервер mysqld получают пакет, размер которого превышает байты max_allowed_packet, он выдает ошибку пакета слишком большого размера и закрывает соединение.

Чтобы просмотреть значение по умолчанию для переменной max_allowed_packet, выполните в MySQL следующую команду:

show variables like 'max_allowed_packet';

Стандартная установка MySQL имеет значение по умолчанию 1048576 байт (1 МБ). Это может быть увеличено путем установки более высокого значения для сеанса или соединения.

Это устанавливает значение в 500 МБ для каждого (вот что означает GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

проверить изменения в новом терминале с новым подключением:

show variables like 'max_allowed_packet';

Теперь он должен работать без ошибок при бесконечной вставке записей. Спасибо

20 голосов
/ 21 мая 2012

Запрос ограничен max_allowed_packet в целом.

8 голосов
/ 08 июня 2013

относится к http://forums.mysql.com/read.php?20,161869,, это связано с вашей конфигурацией mysql: max_allowed_packet, bulk_insert_buffer_size, key_buffer_size.

5 голосов
/ 21 августа 2010

Вы можете вставить бесконечное количество строк одним оператором INSERT. Например, вы можете выполнить хранимую процедуру, цикл которой выполняется тысячу раз, каждый раз при выполнении запроса INSERT.

Или ваш INSERT может отключить триггер, который сам выполняет INSERT. Который отключает другой триггер. И так далее.

Нет, это не зависит от количества наборов значений. И при этом это не зависит от количества байтов.

Существует ограничение на то, насколько глубокими могут быть ваши круглые скобки, и ограничение на длину вашего общего утверждения. По иронии судьбы оба они упоминаются на thedailywtf.com. Однако оба средства, о которых я говорил выше, преодолевают эти пределы.

3 голосов
/ 22 сентября 2017

Вы достигнете предела max_allowed_packet и ошибка

: 1390 Подготовленный оператор содержит слишком много заполнителей.

Вы можете поместить 65535 заполнителей в один sql. Так, если у вас два столбца в одной строкеВы можете вставить 32767 строк в один sql.

Импорт 50K + записей в MySQL дает общую ошибку: 1390 Подготовленный оператор содержит слишком много заполнителей

1 голос
/ 27 марта 2013

Ограничено max_allowed_packet.
Вы можете указать, используя: mysqld --max_allowed_packet=32M По умолчанию 16M.
Вы также можете указать в my.cnf в / etc / mysql /

1 голос
/ 21 августа 2010

Я полагаю, что не существует определенного числа строк, которые вы ограничиваете для вставки в INSERT, но может быть какой-то максимальный размер для запросов в целом.

...