我应该相信 mysql 会删除我要求的所有行吗?

Should I trust mysql that delete all rows that I ask?

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

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

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

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

如果没有,那么我可以信任mysql?

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

如果你想坚持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 等错误

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

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

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

MyISAM 不支持原子操作。 DELETE 在处理要删除的行时可以被中断。因此它删除的行可能比预期的要少——而且它们真的被删除了。无法回滚。

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