当前位置: 首页 > 知识库问答 >
问题:

PHP MySQL使用准备好的语句按批批量插入

壤驷茂实
2023-03-14

我有一个脚本可以插入大量的数据。此数据主要是前一个insert的复制,但至少有一个值不同。因此,我准备语句并绑定参数以执行和重复。

我现在使用的代码(一次全部大容量插入):

$Data = array(
    array("1", "2", "3", "4"),
    array("1", "2", "3", "5"),
    array("1", "2", "3", "6"),
    array("1", "2", "3", "7"),
    array("1", "2", "3", "8"),
    //ETC
    );
//AS YOU CAN SEE, ONLY COL4 CHANGES
$sql = $mysqli->prepare("INSERT INTO `Table` (Col1, Col2, Col3, Col4) VALUES ".implode(', ', array_fill(0, count($Data), "(?, ?, ?, ?)")));
foreach ($Data as $InsertData) {
    $sql->bind_param('iiii', $InsertData[0], $InsertData[1], $InsertData[2], $InsertData[3]);
    }
$sql->execute();

我想要实现的是,数据将用像上面这样的准备好的语句插入,但每个批处理的限制是1000(或任何其他数字)。我不能让这件事发生。我尝试使用array_splice和其他方法,但无法使其工作。

共有1个答案

逄征
2023-03-14

您可以使用简单的for循环在段中工作,而不是尝试添加数组的任何副本:

$arraySize = count($Data);
for ( $i = 0; $i < $arraySize; $i+=1000 )    {
  // Number of elements in this chunk
  $thisChunk = min(1000, $arraySize-$i);
  // Prepare your statement
  $sql = $mysqli->prepare("INSERT INTO `Table` (Col1, Col2, Col3, Col4) VALUES ".implode(', ', array_fill(0, $thisChunk, "(?, ?, ?, ?)")));
  for( $j = $i; $i < $i + $thisChunk; $j++ )  {
    // Bind this data from $Data[$j]
  }
}

这当然会每次重新准备您的语句,如果您知道thisChunk有1000个元素长,那么您可以避免这种情况。

 类似资料:
  • 问题内容: 我试图用大约50,000行10列填充Java中的resultSet,然后使用的方法将它们插入到另一个表中。 为了使过程更快,我进行了一些研究,发现在将数据读入resultSet时,fetchSize起着重要的作用。 如果fetchSize太低,可能会导致到服务器的行程过多,而fetchSize太高则会阻塞网络资源,因此我做了一些尝试,并设置了适合我的基础结构的最佳大小。 我正在阅读此r

  • 问题内容: 使用JDBC(Oracle),我需要在两个表的每一个中插入大约一千行。像这样: 问题在于两个表都是通过公共序列连接的,因此语句的顺序很重要。 如果我只有一张桌子,那会很容易。在这种情况下,我使用了代码: 但是,这种方法只能用一个准备好的语句,因此只能用一个插入。我该如何解决这个问题? 问题答案: 你可以试试 然后

  • 我在调试中不断看到这个错误。登录cassandra, 在这个里面 因此,根据Cassandra中的这个标签,https://github . com/krasserm/akka-persistence-Cassandra/issues/33,我看到这是由于输入有效负载大小的增加,所以我将cassandra.yml中的< code > commit log _ segment _ size _ in

  • 问题内容: 我想在 同一批中 发送 两个不同的准备好的语句 。 目前,正如您在注释行中看到的那样,我将一分为二,并且可以正常工作,但这不是这里的主要目标。谁能告诉我用什么代替这些评论,以使此功能正常工作? 问题答案: 您不能在一个批处理中执行两个不同的语句。正如@dan所提到的,您可以-并且 必须 -在单个事务中完成它们。 另一种选择是使用存储过程,该存储过程可以在一次往返服务器的过程中完成所有操

  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名称。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 但我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建

  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我将只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建一