MySQL - скільки рядків я можу вставити в один вираз INSERT?


91

Чи залежить це від кількості наборів значень? Чи залежить це від кількості байтів у інструкції INSERT?

Відповіді:


93

Ви можете вставити нескінченно велику кількість записів, використовуючи INSERT ... SELECTшаблон, за умови, що ці записи або їх частина є в інших таблицях.

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


44

В ідеалі Mysql дозволяє створювати нескінченну кількість рядків в одній вставці (відразу), але коли a

Клієнт 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 потрапляють у базу даних. Справа лише в тому, хто що підраховує.
Бореалід

2
це правда, але ваш перший приклад показує, як виконувати запит у циклі, причому кожен цикл виконує один оператор INSERT, і він нічого не говорить про те, що один оператор INSERT вставляє кілька рядків. це лише питання акценту.
Лукман,

Ніхто не може робити нічого нескінченного. Завжди існують обмеження ресурсів.
Адріен,

Чи стосується це також оператора SELECT ... FROM? Я маю на увазі, якщо дані були вставлені спочатку з max_allowed_packet, чи не слід це вибрати і після цього ?. Мені незрозуміло, чому це застосовується до всіх інших тверджень, як інший плакат, коли його все одно потрібно вставити перед чимсь іншим.
Чудовий

6

Ви досягнете максимального дозволеного_пакета та

помилка: 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.