【问题标题】:PDO::MYSQL_ATTR_USE_BUFFERED_QUERY and multiple delete statements in prepared statementPDO::MYSQL_ATTR_USE_BUFFERED_QUERY 和准备好的语句中的多个删除语句
【发布时间】:2010-02-01 10:21:43
【问题描述】:

我正在尝试使用从两个(临时)表中删除的准备好的语句:

public function clearTempTables()  
{  
   static $delStmt = null;  
    if (null == $delStmt)  
    {  
        $delStmt = $this->pdo->prepare("DELETE FROM product_string_ids;   
                                        DELETE FROM product_dimension_value_ids;");  
    }  

    $delStmt->execute();
}

调用此函数成功,但之后执行语句时,收到如下错误:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  
Consider using PDOStatement::fetchAll().  
Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

在创建我的 PDO 对象时设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(如文档和许多 Web 示例中所示)似乎没有效果,并且调用 $delStmt->fetchAll() 会导致“SQLSTATE [HY000]:一般错误” ,这是有道理的,因为 delete 语句不应该返回并且结果无论如何都需要获取。

我在这里做错了什么?甚至可以像这样将多个 SQL 语句准备成一个语句吗?从性能的角度来看,这当然是有道理的,尤其是在处理大量查询的情况下,这些查询将在临时表上运行,然后只返回最终结果集。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    Afaik 不可能将多个语句准备为一个(组合)准备语句。
    但是DELETE syntax 允许您指定多个表来删除行。

    $this->pdo->prepare("
      DELETE
        product_dimension_value_ids,product_string_ids
      FROM
        product_dimension_value_ids,product_string_ids
    ");
    

    (现在已经测试过了)

    【讨论】:

    • 谢谢。很遗憾,我不能将 SQL 语句捆绑在一起,因为这会限制我处理其他内容,但 DELETE 语法提示会有所帮助。知道 PDO 如何处理存储过程吗?它们本质上不只是收集语句吗?
    • 不,看起来从多表中删除语法毕竟是无效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多