INSERT: вставка нескольких строк одновременно или одна за другой? - PullRequest
2 голосов
/ 01 августа 2011

Я вставляю несколько строк в таблицу и получаю следующее сообщение:

Сервер MySQL пропал

Мой запрос:

INSERT INTO table
 (a,b,c,d,e,f,g,h,i,j,k) 
     VALUES(1,2,3,4,5,6,7,8,9,10,11),(1,2,3,4,5,6,7,8,9,10,11), ...
        ON DUPLICATE KEY UPDATE
          c=VALUES(c),
          d=VALUES(d),
          e=VALUES(e),
          f=VALUES(f),
          g=VALUES(g),
          h=VALUES(h),
          i=VALUES(i),
          j=VALUES(j)

Это потому, что я поместил слишком много значений в один запрос?(Есть около 5000 пар значений из массива, который я взрываю с ,).

Если это причина - тогда я должен вставлять каждую строку одну за другой?Это медленнее, чем вставлять их все сразу?


Код PHP:

foreach($data as &$entry)
 $entry = "('".implode("','", array(
   $entry->ID,
   addslashes($entry->field_1),
   addslashes($entry->field_2),
   ...

 ))."')";

$data = implode(',', $data);   

$query = "... VALUES{$data} ON ..."

$data - это массив объектов типа STD ...


изменить снова:)

Поэтому я попытался разбить мой $data на меньшие массивы по 100 элементов каждый:

$data_chunks = array_chunk($data, 100);
foreach($data_chunks as $data_chunk)
  insert_into_db($data_chunk);

, и это работает, я не получаю эту ошибкубольше ...

Это означает, что проблема была в очень длинной строке запроса ...

Теперь я еще больше запутался:

  • Есть лиограничение длины запроса или, может быть, аргументы PHP в целом?
  • Есть ли разница между вставкой строка за строкой и вставкой нескольких строк?Стоит ли array_chunk ()?

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Возможно, ваш запрос выполняется слишком долго, mysql останавливается и закрывает соединение.Вы можете изменить системные переменные, чтобы ждать дольше.

http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

0 голосов
/ 02 августа 2011

Я думаю, что ваша проблема с * max_allowed_packet *, хотя ошибка, кажется, указывает в другом направлении. Попробуйте сделать как предложено здесь: http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

Или, прежде чем вносить какие-либо изменения в конфигурацию mysql, просто выполните strlen () ваш запрос и выясните, насколько длинным (в байтах) он фактически является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...