SQL更新两个表的事务语法

时间:2014-02-16 22:47:50

标签: mysql sql

我的语法有问题,一次更新两个表。我的代码目前看起来像这样:

if ($stmt = $mysqli->prepare('

            BEGIN TRANSACTION

            UPDATE items_woods
            SET items_woods.oak = ´1´
            FROM items_woods T1, skills_woodcutting T2
            WHERE T1.id = T2.id 
            and T1.id = ´?´

            UPDATE skills_woodcutting
            SET skills_woodcutting.exp = ´1´
            FROM items_woods T1, skills_woodcutting T2
            WHERE T1.id = T2.id
            and T1.id = ´?´

            COMMIT


            ')) {
                /* Bind parametres */
                $stmt->bind_param('i', $id);

                /* Insert the parameter values */
                $id = 1;

                /* Execute the query */
                $stmt->execute();

                /* Close statement */
                $stmt->close();

            } else {
                /* Something went wrong */
                echo 'Something went terrible wrong' . $mysqli->error;
            }

我正在运行MySQL服务器,我无法看到问题出在哪里,如果有人能提示我使用正确的语法,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

  

我尝试过以下这篇文章:How to update two tables in one statement in SQL Server 2005?

上述帖子在您的案例中是一个糟糕的信息来源,因为它是针对SQL Server而不是MySQL。

SQL Server和MySQL对UPDATE具有不同的语法:

  • 在MySQL执行时,SQL Server不允许同时更新多个表。因此,您不需要两次更新。
  • 在MySQL SET子句中,在SQL Server中的所有表引用之后,在FROM子句之前的SQL Server中
  • 在MySQL中,FROM
  • 中没有UPDATE子句

在MySQL中,您可以使用a proper multi-table syntax

在一个UPDATE语句中执行此操作
UPDATE items_woods t1 JOIN skills_woodcutting t2
    ON t1.id = t2.id 
   SET t1.oak = 1,
       t2.exp = 1
 WHERE t1.id = ?;

这是 SQLFiddle 演示

<小时/> 你的php代码归结为

$id = 1;
$sql = 'UPDATE items_woods t1 JOIN skills_woodcutting t2
            ON t1.id = t2.id 
           SET t1.oak = 1,
               t2.exp = 1
         WHERE t1.id = ?';

if ($stmt = $db->prepare($sql)) {
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->close();
} else {
    die('Error: ' . $db->error); //TODO:better error handling
}

现在除了SQL Server和MySQL之间UPDATE语法的差异之外,如果由于某种原因,您需要发布多个更新语句,那么您的代码仍会存在其他问题:

  1. 您不能使用prepare()execute()一次准备和执行多个SQL语句;您可以逐个准备和执行它们,也可以使用mysqli_multi_query()
  2. 如果您使用mysqli_multi_query(),则必须以分号;终止每个SQL语句。