2013-01-05 59 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();