2017-06-26 46 views
0

我找不到我的问题的答案。我希望我不会重复。我应该相信mysql删除我询问的所有行吗?

所以,假设我有row_parent_id = 3正好10行。

有可能mysql的命令DELETE FROM table WHERE row_parent_id = 3删除只有 9行因为... mysql上有错误?

如果是,如果可能会发生某些错误,并且查询将只删除9行,那么意味着我必须在之前统计任何删除操作?

如果不行,那我可以信任mysql吗?

PS:我正在使用PDO并准备好语句。我只是不明白在删除之前是否需要对行进行计数。我想确保所有的行都按照我的要求被删除。

回答

1

你必须明白,MySQL的InnoDB存储引擎支持atomic operations。原子的意义在于不能进一步分裂,而不是原子弹的意义。

这意味着如果DELETE成功,这意味着它删除了全部匹配的行。没有部分成功。如果它只删除了9行,这意味着只有9个匹配的行对您的事务可见。

在InnoDB中,如果DELETE被中断或遇到错误,那么到目前为止它所删除的所有行都会自动恢复;没有被删除。

MyISAM不支持原子操作。 DELETE在正在处理要删除的行时可以被中断。因此它可能会删除比预期更少的行,并且它们真的被删除了。没有回滚是可能的。

这是你不应该使用MyISAM的重要原因!

0

如果您想保留9行删除,即使在某一行出现错误,您也可以按照您所说的去做。您可以在DELETE操作之前对行进行计数,您可以在操作后获取受PDOStatement::rowCount(void)影响的行数。

但是,如果你想赶上例外,从来没有删除任何行,如果有错误发生,那么你可以做这样的:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false); 
$pdo->beginTransaction(); 
try{ 
    $pdo->exec("DELETE FROM table WHERE row_parent_id = 3"); 
    $pdo->commit(); 
}catch(Exception $e) 
{ 
    echo "exception occured !"; 
} 

关于你的最后一个问题,永远不要相信MySQL的有关处理行。你总是可以得到像constraint violations等错误。

+0

我正在使用事务处理,并且还检查错误,如在您的示例中使用catch块。无论如何,在你看来,我应该在删除之前计数。我仍然在等待更多意见。感谢您的回答! – Andrei

相关问题