我在表中插入多行,我收到此消息:
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);
并且它有效,我不再得到那个错误......
这意味着问题是很长的查询字符串......
现在我更加困惑:
答案 0 :(得分:3)
可能是您的查询花了太长时间才完成,mysql超时并关闭连接。您可以更改系统变量以等待更长时间。
答案 1 :(得分:0)
我认为你的问题是* max_allowed_packet *,虽然错误似乎指向不同的方向。尝试按照此处的建议进行操作:http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html
或者,在对mysql配置进行任何更改之前,只需strlen()查询并找出它实际上有多长(以字节为单位)。