我应该相信删除我问的所有行的mysql吗?

时间:2017-06-26 02:26:32

标签: mysql pdo prepared-statement sql-delete

我找不到我的问题的答案。我希望我不会复制。

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

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

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

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

PS:我正在使用PDO和预备语句。我只是不明白是否有必要在删除之前计算行数。我想确保所有行都按照我的要求删除。

2 个答案:

答案 0 :(得分:1)

您必须了解MySQL的InnoDB存储引擎支持atomic operations。原子在任何意义上都是不可分裂的,而不是在原子弹的意义上。

这意味着如果DELETE成功,则表示它删除了所有匹配的行。没有部分成功。如果它只删除了9行,则表示您的交易只能看到9个匹配的行。

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

MyISAM不支持原子操作。 DELETE在处理要删除的行时可能会被中断。因此它可能会删除比预期更少的行 - 并且它们确实被删除了。无法回滚。

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

答案 1 :(得分: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等错误。