PHP MySQL Bulk inserts by BATCH with prepared statements

标签 php mysql prepared-statement bulkinsert

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

但是,我尝试将其写入准备好的批量插入,一次插入 1000 行顶部。不幸的是,我无法让它工作。我现在使用的代码只是一次插入整个数据。然而,这是不希望的,因为数据量可能比测试的要大得多。

我现在使用的代码(一次性批量插入):

$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 和其他方法,但我无法让它工作。

最佳答案

您应该考虑使用 LOAD DATA INFILE。

它可能比对成批行使用 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
    );

$tempname = tempnam("/tmp", "data");
$fp = fopen($tempname, "w");
foreach ($Data as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
if ($mysqli->query("
  LOAD DATA INFILE '$tempname' INTO TABLE `Table`
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
  ") === false) {
    error_log($mysqli->error);
}
unlink($tempname);

阅读https://dev.mysql.com/doc/refman/5.7/en/load-data.html确保您了解 LOCAL 选项以及 local_infilesecure_file_priv 配置选项。

关于PHP MySQL Bulk inserts by BATCH with prepared statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43721973/

相关文章:

javascript - 我如何从 PHP fetch assoc 获取结果

mysql_connect 不适用于我的 Windows 机器上的本地主机

javascript - 将数据发送到 mysql 表时,html 按钮(onclick)不起作用

mysql - 执行语句只返回#Rows

php - MySQLi - 当您有超过 15 个 '?' 和 sisisissssisisiss 的查询时,您如何跟踪?

java - JAVA 中的 cURL 等效项

php - 自定义验证器被访问两次

mysql - 查询以获取最新版本(如果有)或仅获取文档(否则)

java - 在 Oracle DB 上执行 PreparedStatement 插入 Blob 时出现 NullPointerException

php - 在本地数据库中存储 Amazon API 数据