INSERT:一次插入多行,还是一个一个地插入?

时间:2011-08-01 17:41:06

标签: php mysql database

我在表中插入多行,我收到此消息:

  

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 个答案:

答案 0 :(得分:3)

可能是您的查询花了太长时间才完成,mysql超时并关闭连接。您可以更改系统变量以等待更长时间。

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

答案 1 :(得分:0)

我认为你的问题是* max_allowed_pa​​cket *,虽然错误似乎指向不同的方向。尝试按照此处的建议进行操作:http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

或者,在对mysql配置进行任何更改之前,只需strlen()查询并找出它实际上有多长(以字节为单位)。