【问题标题】:Mysql INSERT and DELETE in a single statement with dependant on eachotherMysql INSERT 和 DELETE 在一条语句中相互依赖
【发布时间】:2015-05-17 17:22:09
【问题描述】:

我有以下两个疑问。第二个查询依赖于第一个。

$query1 = mysql_query("Insert into table_one set ---- ");
if($query1)
{
   $query2 = mysql_query("delete from table_two where condition---");
   if($query2)
   {
      $message = "both queries executed successfully";
   }
   else
   {
      $del = mysql_query("delete record inserted by $query1");
   }
}

我们能否在一条语句中执行这两个查询,以便两个查询相互依赖。
如果 INSERT 查询失败,DELETE 查询也会失败,如果 DELETE 查询失败 INSERTION in query first失败。

谢谢

【问题讨论】:

标签: php mysql database mysqli


【解决方案1】:

如果我很了解您的需求,只需使用事务即可。 在插入之前运行此查询:

mysql_query('begin');

然后,如果一切顺利,提交事务:

mysql_query('commit');

如果出现任何故障,您可以回滚所做的每项更改:

mysql_query('rollback');

请注意,对于 MySQL,MyISAM 引擎不支持事务回滚,因此请使用 InnoDB。

在此处阅读有关交易的更多信息:https://dev.mysql.com/doc/refman/5.0/en/commit.html

代码示例:

<?PHP

mysql_query('begin'); //start transaction
$query1 = mysql_query("Insert into table_one set ---- ");
if($query1)
{
   $query2 = mysql_query("delete from table_two where condition---");
   if($query2)
   {
      mysql_query('commit'); //both queries went fine, so let's save your changes and end the transaction
      $message = "both queries executed successfully";
   }
   else
   {
      mysql_query('rollback'); //query2 failed, so let's rollback changes made by query1 and end the transaction
   }
}
else
    mysql_query('rollback'); //query1 failed, so let's end the transaction

【讨论】:

  • 感谢您的回复。先生,请指导我如何使用 begin、commit 和 rollback 提出的这两个查询
  • 问题已解决,感谢您的帮助,但先生,我还有一个小问题,我们可以执行相同的任务并在单个 mysql_query("statement"); 中运行上述所有查询
  • mysql_query 一次只支持一个语句,所以不支持。但是有类似mysqli_multi_query 的东西,但您需要(而且您应该)将所有 mysql_* 函数更改为 mysqli_* 函数。
  • 亲爱的请检查我的答案,并告诉我这个解决方案是否完美,实际上我的答案是您的答案的更新形式
【解决方案2】:

如果 query2 失败,它不会检查 query1。

$query1 = mysql_query("Insert into table_one set ---- ");
$query2 = mysql_query("delete from table_two where condition---");
if( $query2 && $query1)
{

      $message = "both queries executed successfully";
}
else if(!$query2)
   {
      $del = mysql_query("delete record inserted by $query1");
   }

【讨论】:

  • 感谢您的回复,您给了我一个好主意,当两个查询都成功完成但如果第二个查询失败时这个概念很好,那么查询将是什么$del = mysql_query("delete record inserted by $query1");
  • 如果 query2 失败,那么它不会走得更远。如果它没有失败,那么 query1 将被执行。我认为它可以解决您的问题。
【解决方案3】:

可以使用事务,如果任何查询失败则调用回滚,否则提交

【讨论】:

  • 请给我一点概念如何使用它,我是新手。谢谢
【解决方案4】:

我找到了一个最佳解决方案。
扩展@Luki 的想法我写了以下代码,它给了我非常满意的答案。首先使用下面的函数。

function multi_statement()
{
    global $conn;
    $total_args = func_get_args();
    $args = implode($total_args,";");
    $args = "begin;".$args.";commit;";
    $number = 0;
    if($conn->multi_query($args))
    {
        do
        {
            if ($conn->more_results())
            {
                $number++;
            }
        }
        while($conn->next_result());
    }
    if($number < (count($total_args)+1))
    {
        $conn->query('rollback');
        echo "Sorry..!!! Error found in Query no:".$number;
    }
    else
    {
        echo "All queries executed successfully";
    }
}

然后我用多个语句调用函数,所有这些语句都是相互依赖的。万一任何查询出错,数据库中没有任何查询发生任何更改。

    $statement1 = "INSERT INTO `pic_gall`.`admin` (`admin_id`, `username`, `password`) VALUES (NULL, 'as1', 'as1')";
    $statement2 = "INSERT INTO `pic_gall`.`admin` (`admin_id`, `username`, `password`) VALUES (NULL, 'as2', 'as2')";
    $statement3 = "INSERT INTO `pic_gall`.`admin` (`admin_id`, `username`, `password`) VALUES (NULL, 'as3', 'as3')";
    $statement4 = "INSERT INTO `pic_gall`.`admin` (`admin_id`, `username`, `password`) VALUES (NULL, 'as4', 'as4')";
    $statement5 = "DELETE from user where user_id = '12'";
multi_statement($statement1,$statement2,$statement3,$statement4,$statement5);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多