2017-06-26 4 views
0

質問の回答が見つかりません。私は重複しないことを願っています。私が尋ねるすべての行を削除するmysqlを信頼すべきでしょうか?

だから、私はちょうどrow_parent_id = 3で10行を持っているとしましょう。

DELETE FROM table WHERE row_parent_id = 3のmysqlがの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

私はトランザクションを使用しており、私はあなたの例のようなキャッチブロックでエラーをチェックします。とにかく、あなたの意見では、私は削除する前に数える必要があります。私はまだ多くの意見を待っています。あなたの答えに感謝します! – Andrei

関連する問題