2015-05-17 89 views
0

我有以下兩個查詢。第二個查詢依賴於第一個查詢。Mysql INSERT和DELETE在一個聲明中依賴於彼此

$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首先失敗。

感謝

+2

您使用交易。這些可以在失敗時回滾。 –

回答

2

如果我好知道你需要什麼,只需使用事務。 您插入之前運行此查詢:

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 
+0

感謝您的回覆。先生,請指導我如何使用這兩個問題詢問有問題的開始,提交和回滾 –

+0

給我一秒;) – Luki

+0

我編輯了我的答案與示例 – Luki

0

可以使用事務,如有查詢失敗,然後打電話回退,否則提交

+0

請給我一個小概念如何使用它,我是新來的。謝謝 –

+0

Luki做到了:) – ArnesTwin

+0

好的謝謝,我正在嘗試 –

1

如果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"); 
    } 
+0

感謝您的回覆,您給我一個好主意,當兩個查詢都成功完成後,如果查詢2失敗,那麼它將不會進一步進行。如果查詢2失敗,那麼將查詢'$ del = mysql_query(「delete query by $ query1」插入的記錄);' –

+0

。如果它沒有失敗,那麼query1將被執行。我認爲它解決了你的問題。 –

0

我找到了最佳解決方案。
@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);