Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL更新两个表事务语法_Mysql_Sql - Fatal编程技术网

Mysql SQL更新两个表事务语法

Mysql SQL更新两个表事务语法,mysql,sql,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

一次更新两个表的语法有问题。我的代码当前如下所示:

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服务器,我看不出问题出在哪里,如果有人能提示我正确的语法,我将不胜感激。谢谢


我尝试过以下这篇文章:

上述文章在您的案例中是一个不好的信息来源,因为它是针对SQL Server而不是MySQL的

SQL Server和MySQL对于更新有不同的语法:

  • SQL Server不允许同时更新多个表,而MySQL则允许。因此,您不需要两次更新
  • 在MySQL中,在SQL Server中,SET子句位于所有表引用之后,而在SQL Server中,SET子句位于FROM子句之前
  • 在MySQL中,
    UPDATE
    中没有
    FROM
    子句
也就是说,在MySQL中,您可以通过使用

更新物品\u woods t1加入技能\u Woodcuting t2
在t1.id=t2.id上
设置t1.oak=1,
t2.exp=1
其中t1.id=?;
这里是演示


您的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语句,那么您的代码还存在其他问题:

  • 不能使用
    prepare()
    execute()
    同时准备和执行多个SQL语句;您可以逐个准备并执行它们,也可以使用
  • 如果您使用的是
    mysqli\u multi\u query()
    ,则必须以分号
    终止每个SQL语句

  • 要包括您的错误消息吗?(但是试着使用类似于
    从skills\u woodcutting更新items\u woods SET oak='1',其中items\u woodcutting.id=skills\u woodcutting.id和items\u woods.id='?“
    )在执行时唯一发生的事情是底部的错误“出了严重的错误”。嗯,在我看来,我的语法应该是正确的,但是肯定有一些不正确的东西,我也可以在查询中看到两个参数,并且只有一个参数绑定。我尝试了以下帖子:这是一个非常好的答案,非常感谢,我将在一个小时内尝试。干杯