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


91

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

Ответы:


93

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

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


44

В идеале 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';

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


11
500 МБ - это не бесконечно. Это намного больше, чем значение по умолчанию, но все же не бесконечно.
Carlos2W

Вопрос: для чего именно этот лимит? Сам запрос? Как насчет данных, привязанных при выполнении оператора? Могу ли я быть в безопасности, пока strlen($query_with_questionmarks) < $max_alloweed_packet?
пилат

Если бы вы пытались установить максимально возможное значение, то это 1 ГБ, что выглядело бы так: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



6

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

Или ваш INSERT может активировать триггер, который сам выполняет INSERT. Что срабатывает еще один триггер. И так далее.

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

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


Ваши примеры предназначены для запуска нескольких INSERT, и он не показывает вставку нескольких строк в один оператор INSERT ..
Лукман,

@Lukman: Один запрос INSERT может привести к тому, что несколько INSERTS попадут в базу данных. Просто вопрос в том, кто что считает.
Borealid

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

Никто не может делать ничего бесконечного. Всегда есть ограничения на ресурсы.
Адриан

Это относится и к оператору SELECT ... FROM? Я имею в виду, что если данные были вставлены в первую очередь с помощью max_allowed_packet, не следует ли выбирать этот элемент и после этого ?. Я не понимаю, почему это применяется ко всем другим утверждениям, как сказал другой плакат, когда его сначала нужно вставить перед чем-либо еще.
Thielicious

6

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

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

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

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


2

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


2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.