当前位置: 首页 > 面试题库 >

批量参数化插入

华炜
2023-03-14
问题内容

我试图切换一些硬编码的查询以使用参数化输入,但是遇到一个问题:如何格式化参数化批量插入的输入?

当前,代码如下所示:

$data_insert = "INSERT INTO my_table (field1, field2, field3) ";
$multiple_inserts = false;
while ($my_condition)
{
    if ($multiple_inserts)
    {
        $data_insert .= " UNION ALL ";
    }

    $data_insert .= " SELECT myvalue1, myvalue2, myvalue3 ";
}

$recordset = sqlsrv_query($my_connection, $data_insert);

一个可能的解决方案(从如何将数组插入到一个带有PHP和PDO的单个MySQL
Prepared语句中
修改而来)似乎是:

$sql = 'INSERT INTO my_table (field1, field2, field3) VALUES ';
$parameters = array();
$data = array();
while ($my_condition)
{
    $parameters[] = '(?, ?, ?)';
    $data[] = value1;
    $data[] = value2;
    $data[] = value3;
}

if (!empty($parameters)) 
{
    $sql .= implode(', ', $parameters);
    $stmt = sqlsrv_prepare($my_connection, $sql, $data);
    sqlsrv_execute($stmt);
}

有没有更好的方法来完成带有参数化查询的批量插入?


问题答案:

好吧,您有三个选择。

  1. 一次构建-执行多次。基本上,您只需为一行准备一次插入,然后循环执行该插入。由于SQLSERVER扩展在准备好查询后不支持重新绑定查询(您需要使用reference进行肮脏的破解),所以这可能不是最佳选择。

  2. 一次构建-一次执行。基本上,您按照示例中的说明构建了一个巨型插入物,将其绑定一次,然后执行它。这有点脏,并且错过了准备查询所提供的一些好处。但是,由于需要选项1的引用,我愿意这样做。我认为构建大型查询而不是依赖变量引用会更清洁。

  3. 建立多个-执行多个。基本上,采用您正在执行的方法,并对其进行调整以每隔这么多记录重新准备查询。这样可以防止过大的查询,并使查询“成批”。所以像这样:

    $sql = 'INSERT INTO my_table (field1, field2, field3) VALUES ';
    

    $parameters = array();
    $data = array();

    $execute = function($params, $data) use ($my_connection, $sql) {
    $query = $sql . implode(‘, ‘, $parameters);
    $stmt = sqlsrv_prepare($my_connection, $query, $data);
    sqlsrv_execute($stmt);
    }

    while ($my_condition) {
    $parameters[] = ‘(?, ?, ?)’;
    $data[] = value1;
    $data[] = value2;
    $data[] = value3;
    if (count($parameters) % 25 == 0) {
    //Flush every 25 records
    $execute($parameters, $data);
    $parameters = array();
    $data = array();
    }
    }
    if (!empty($parameters)) {
    $execute($sql, $parameters, $data);
    }

两种方法都足够。做您认为最适合您要求的事情…



 类似资料:
  • 问题内容: 我在将不同的缓冲区大小插入到本地SQLite DB中时发现,当缓冲区大小为10,000时,插入10,000,000行数据需要花费近8分钟的时间。换句话说,它需要1,000次写入来存储所有内容。 8分钟存储10,000,000个似乎太长了(或者是?) 可以优化以下任何一项以提高速度吗?请注意,插入的数据是字符的随机集合。 创建表格后,通过 是否可以进一步优化上述任何一项? 问题答案: 我

  • 问题内容: 我需要通过REST API的Batch端点将大量节点及其之间的关系插入到Neo4j中,大约每秒5k记录(仍在增加)。 这将是24x7连续插入。每条记录可能只需要创建一个节点,而其他记录可能需要两个节点并创建一个关系。 是否可以通过更改程序或修改Neo4j的设置来提高插入件的性能? 到目前为止,我的进度: 1.我已经使用Neo4j进行了一段时间的测试,但无法获得所需的性能 测试服务器盒:

  • 问题内容: 这是我在阅读有关jpa批量插入的几个主题之后创建的简单示例,我有2个持久对象User和Site。一个用户可以拥有多个站点,因此我们在这里有一对多的关系。假设我要创建用户并将多个站点创建/链接到用户帐户。考虑到我愿意为Site对象使用批量插入,代码如下所示。 但是,当我运行此代码时(我将hibernate方式用作jpa实现提供程序),我看到以下sql输出: 所以,我的意思是“真实的”批量

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 我创建了一个向MySql数据库插入数百万个值的程序。我读到过有关批插入的文章,它将优化我的程序并使其更快,但当我尝试这样做时,它以同样的方式工作。我没有将每个值插入数据库,而是每次将500个值保存在一个列表中,然后将它们插入一个大循环中,如下所示: 然后我删除列表中的所有值,并再次开始收集500个值。它不应该工作得更好吗? 我的插入代码是: 我有一些问题: 1。为什么当我批量插入时它不能更快地工作