将几个MySQL语句合并为一个

时间:2014-04-24 08:53:14

标签: php mysql

我快速连续发出这三个电话:

UPDATE job 
   SET jstatus = '9'
 WHERE snum = :u AND jstatus = '7' AND jdate < :d

DELETE FROM job 
 WHERE snum = :u AND jstatus < '7' AND jdate < :d

DELETE FROM jdate 
 WHERE snum = :u AND jdate < :d

每个参数都是相同的。目前,每一项工作如下:

$STH = $DBH->prepare("
UPDATE job 
   SET jstatus = '9'
 WHERE snum = :u AND jstatus = '7' AND jdate < :d");
$STH->bindParam(':u', $json['u']);
$STH->bindParam(':d', $date);
try{$STH->execute();}catch(PDOException $e){echo $e->getMessage();} 

当然必须有办法将它们结合起来?我看过$mysqli->multi_querySO question,但两者看起来都比我想象的要复杂得多。

3 个答案:

答案 0 :(得分:2)

我假设您使用符合ACID标准的引擎(或我们的凡人,支持交易的引擎),我会提供答案。

您要做的是避免代码复杂性 - 在这种情况下,它运行3个查询捆绑到1中。维护大量查询非常困难,您应该不惜一切代价避免这种情况。

您想要的是尽可能快地执行查询并尽可能清楚地阅读和理解。

此外,您需要确定查询所有已执行的内容,或者如果其中任何一项失败都会失败 - 这是一项交易。您不希望删除失败但成功更新,这将破坏您的数据完整性。

这就是你应该使用交易的原因。这样做的巨大好处是,您可以以普通人的方式查询数据库(一次一个查询),确保一切正常或没有发生任何事情,加上它几乎与将所有内容捆绑成一个一样快巨大的,丑陋的无法维护的查询。

以下是代码:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$pdo = new PDO($dsn, $user, $password);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try 
{   
    $pdo->beginTransaction();


    /**
     * Repeat for as many queries you wish to execute, I used only 1 for the example
     */
    $stmt = $pdo->prepare("
                UPDATE job 
                SET jstatus = '9'
                WHERE snum = :u AND jstatus = '7' AND jdate < :d");             

    $stmt->bindParam(':u', $json['u']);
    $stmt->bindParam(':d', $date);

    $stmt->execute();

    $pdo->commit();    
} 
catch(PDOException $e) {

    $pdo->rollBack();

    echo 'Error: ' . $e->getMessage();
}

答案 1 :(得分:1)

答案 2 :(得分:0)