2013-01-05 97 views
3

我有兩個查詢都相互依賴,即如果第一個查詢沒有執行第二個不應該執行,反過來如果第二個不能執行的第一個應該'被執行。多個查詢彼此依賴

INSERT INTO `table` VALUES (1,2,3) 
UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert 

ON DUPLICATE KEY UPDATE是不是answear。

我試過使用mysqli::multi_query,但事實證明它執行第一個,即使第二個不能執行(它會在錯誤時停止)。

如果我說的不清楚,請詢問更多信息。

任何人都可以幫助我嗎?

+1

「如果第二不能執行所述第一不應該執行」這要求是一個直接挑戰邏輯。 Impossible –

+0

@HankyPanky數據庫交易專門用於處理這些案件,以確保一致性。 – tmuguet

回答

4

如果您使用的引擎支持它(InnoDB,BDB),您可以使用事務。

查看http://dev.mysql.com/doc/refman/5.0/en/commit.html舉例。

編輯:使用簡單的例子的mysqli

$connection->autocommit(FALSE); // disable auto-commit and start a new transaction 
$result = $connection->query("INSERT INTO `table` VALUES (1,2,3)"); 
$result &= $connection->query("UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert"); 
if (!$result) { 
    // One of the queries has failed: cancel the transaction 
    $connection->rollback(); 
} else { 
    // Both queries worked:commit the current transaction 
    $connection->commit(); 
} 
$connection->autocommit(TRUE); // enable auto-commit 

您可能要優化查詢(即不執行第二個如果第一個失敗,使用準備好的語句,...)

+1

增加upvote,因爲事務不僅是一個很好的選項,使查詢依賴,但他們也能夠防止在交易等期間斷開dataloss(這就是爲什麼它稱爲交易哈哈) –

+0

它看起來像我需要但我不知道如何實現它。你能介紹一下嗎? – Dharman

+0

我用一個例子更新了我的答案 – tmuguet

-2

分解成多個查詢電話:

$result = mysql_query("INSERT ..."); 
if ($result) { 
    mysql_query("UPDATE ..."); 
} 

但「不做第一,如果第二次不」是不可能的。 PHP無法及時回覆並警告第一個查詢第二個查詢失敗。

+0

從5.5開始不推薦使用mysql_query(),你需要mysqli_query()。 – nerdarama

+2

「PHP無法及時回溯」..實際上PHP的mysqli/mysql函數支持事務處理。事務處理檢查所有查詢是否正常運行。如果其中一個失敗,它將'撤銷'(回滾)查詢 –

-1

使用[INSERT IGNORE]使SQL服務器忽略錯誤。

INSERT IGNORE INTO `table` VALUES (1,2,3); 

然後使用LAST_INSERT_ID()來獲取插入的ID或0,如果沒有插入。這將使UPDATE失敗,如果因爲不存在與一個ID沒有記錄= 0

UPDATE `otherTable` SET `val1`=1 WHERE `id`=LAST_INSERT_ID();