我找不到我的问题的答案。我希望我不会复制。
所以,假设我有10行row_parent_id = 3
。
mysql在命令DELETE FROM table WHERE row_parent_id = 3
上有可能只删除 9行,因为...... mysql上有错误?
如果是,如果可能发生某些错误并且查询只会删除9行,那么这意味着我必须在任何删除操作之前计算行数?
如果不是,那么我可以信任mysql吗?
PS:我正在使用PDO和预备语句。我只是不明白是否有必要在删除之前计算行数。我想确保所有行都按照我的要求删除。
答案 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
等错误。