MySQL只能插入10,000行

时间:2014-07-23 14:19:56

标签: php mysql

我在免费托管服务上使用PHP将行插入MySQL表中,但一次只能添加10,000行,而不是我的代码所需的完整~17,000行。这很奇怪,因为在填充MySQL表的同一个foreach循环中,还会填充JSON文件,并且JSON文件具有~17,000个值,而MySQL表只停留在10,000。

我担心的是因为我的免费托管解决方案,该表最多只能有10,000行,但事实并非如此。如果我运行PHP代码两次,我会得到一个包含20,000行的表,所以这似乎是一个问题,因为我一次只能设置10,000行。

为什么会这样?我检查了第10,000个值,并且没有任何奇怪的内容应该终止连接或违反字符限制。它也不应该达到我所知道的任何大小限制,因为我可以让表达到20,000行,但只有两组10,000。

无论如何,我很困惑,但也许你可以提供帮助。这是我的PHP代码的相关部分:

        foreach ( $cc as $c ) {
$y++;
if($y < $count)
{
fputs($jsonfile2,"{".'"name"'.": ".'"'.$c.'"'.",".'"updatetimetotalminutes"'.": ".'"'.$updatetimetotalminutes.'"'.",".'"updatetime"'.": ".'"'.$updatetime.'"'.",".'"updatetimetotal"'.": ".'"'.$updatetimetotal.'"'.",".'"updateordernumber"'.": ".'"'.$y.'"'.",".'"numberofnations"'.": ".'"'.$numnations.'"'.",".'"founderlessstatus"'.": ".'"'.$founderlessstatus.'"'.",".'"delegatevotes"'.": ".'"'.$delegatevotes.'"'."},");
mysqli_query($con,"INSERT INTO `regions`(`Update Order Number`, `Name`, `Nations`, `Targetable?`, `Time to Update`, `Seconds into the Update`, `Minutes into the Update`, `Delegate Votes`) VALUES ('$y', '$c', '$numnations', '$founderlessstatus', '$updatetime', '$updatetimetotal', '$updatetimetotalminutes', '$delegatevotes')");
}
else
{
fputs($jsonfile2,"{".'"name"'.": ".'"'.$c.'"'.",".'"updatetimetotalminutes"'.": ".'"'.$updatetimetotalminutes.'"'.",".'"updatetime"'.": ".'"'.$updatetime.'"'.",".'"updatetimetotal"'.": ".'"'.$updatetimetotal.'"'.",".'"updateordernumber"'.": ".'"'.$y.'"'.",".'"numberofnations"'.": ".'"'.$numnations.'"'.",".'"founderlessstatus"'.": ".'"'.$founderlessstatus.'"'.",".'"delegatevotes"'.": ".'"'.$delegatevotes.'"'."}"."]");
mysqli_query($con,"INSERT INTO `regions`(`Update Order Number`, `Name`, `Nations`, `Targetable?`, `Time to Update`, `Seconds into the Update`, `Minutes into the Update`, `Delegate Votes`) VALUES ('$y', '$c', '$numnations', '$founderlessstatus', '$updatetime', '$updatetimetotal', '$updatetimetotalminutes', '$delegatevotes')");
}
}

$ con是mysqli_connect()值。

对此有任何帮助将不胜感激。我会提供任何其他信息,如果它可以帮助诊断问题,但由于我的托管解决方案,我对某些设置的访问可能会受到限制。

谢谢!

3 个答案:

答案 0 :(得分:1)

max_updates资源限制计算每个&#34; statement&#34;。

由于您超出max_updates设置,请尝试将插入连接到单个查询(INSERT语句)。以下是插入多行的插入内容MySQL docs的示例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

在单个语句中插入多行的另一个好处是效率更高。

您唯一的限制是max_allowed_packet的大小。

答案 1 :(得分:1)

如果您达到max_updates限制,则可以在给定次数更新后刷新连接,例如:

$row = $con->query("SHOW VARIABLES LIKE 'max_updates'")->fetch_assoc();
$max_updates = $row === FALSE ? 10000 : $row['Value'];

$current_update = 0;
foreach($cc as $c ) {
   if (++$current_update >= $max_updates) {
      $conn->close();
      $conn->real_connect();// Reopen connection here, you'll need your details
      $current_update = 1;
   }
   // ...
}

答案 2 :(得分:0)

  

它也不应该达到我所知道的任何大小限制,因为我可以让表达到20,000行,但只有两组10,000。

你确定吗?当你这样做时,你的数据库不是唯一可能的问题(但可能仍然是一个)。您的PHP配置还有更多功能,例如示例max_execution_time。当您没有显示或记录PHP的错误消息时,您几乎可以解决失败的原因。

所以有一些建议:

  1. 在开发过程中始终启用错误报告

  2. 不仅要依赖PHP的错误消息,还要关注扩展和驱动程序,以及如何处理错误。(例如mysqli_error())< / p>

  3. 如果可以,请使用正确的调试器(例如PHPDBG

  4. 托管不应该基于魔法,而应该基于科学! 因此,请正确告知自己您的主机可以做什么,不能做什么。如果它不符合您的需要,请切换。

  5. 您的网络服务器错误日志(以及您的案例中的数据库日志)是您在开发时最好的朋友

  6. 一次处理大量内容可能不是最好的主意也许您对Batch Processing或RabbitMQ或IronMQ等队列感兴趣。