为啥 mysqli::multi_query 在一定数量的行后停止?

Posted

技术标签:

【中文标题】为啥 mysqli::multi_query 在一定数量的行后停止?【英文标题】:Why does mysqli::multi_query stop after a certain amount of rows?为什么 mysqli::multi_query 在一定数量的行后停止? 【发布时间】:2011-06-13 06:31:06 【问题描述】:

我正在尝试使用 multi_query 在表上运行大量更新/插入。总共有大约 14,000 个查询,但该函数只执行了大约 480 个,然后它没有错误地停止,php 继续执行下面的脚本:

if($this->db->conn_id->multi_query($sql))
    do
        // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
    while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());
    $this->message->set('Import complete.','success',TRUE);
else
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);

【问题讨论】:

查询在达到大约 480 行之前运行了多长时间(以秒为单位)? CI 是否将任何错误记录到日志文件中? @Xoc 查询在失败前运行了不到一秒。 【参考方案1】:

mysqli::multi_query 仅在第一条语句失败时返回 false。要从集合中的其他查询中获取错误,您需要先调用 mysqli::next_result(),这就是 while() 正在做的事情。

但是,由于 mysqli::next_result() 在失败时返回 false,它将导致循环结束并显示“导入完成”消息。您可能需要在设置成功消息之前检查错误,并且只有当错误为空时,才返回成功。

如果语句后面有错误,以下内容至少应该向您显示错误。

if($this->db->conn_id->multi_query($sql))
    do
        // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
     while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());

    if ($error = mysqli_error($this->db->conn_id)) 
        $this->message->set('Import could not be completed. ' . $error,'error',TRUE);
     else $this->message->set('Import complete.','success',TRUE);
 else 
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);

【讨论】:

其实查询本身并没有错误。我正在传递一个 sql 文件的内容,它通过命令行或 gui 工具运行良好。

以上是关于为啥 mysqli::multi_query 在一定数量的行后停止?的主要内容,如果未能解决你的问题,请参考以下文章

mysqli的 mulit_query执行多条语句。

批量执行sql语句

为啥LocationListener会在一段时间后禁用?

为啥 R 不能在一组空索引上正确删除元素?

Windows 文件共享:为啥有时新创建的文件在一段时间内不可见?

为啥 Rust 不允许在一种类型上复制和删除特征?