PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY和准备好的语句中的多个删除语句

时间:2010-02-01 10:21:44

标签: php mysql pdo

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

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]:一般错误“,这是有道理的,因为删除语句不应该返回,结果需要提取。

我在这里做错了什么?甚至可以将多个SQL语句准备到这样的单个语句中吗?从性能的角度来看,它确实有意义,尤其是大量的查询可以在临时表上运行,然后只返回最终的结果集。

1 个答案:

答案 0 :(得分:1)

Afaik不可能将多个陈述准备为一个(合并的)预备陈述 但是DELETE syntax允许您指定多个表以从中删除行。

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

(现在已经过测试)