2012年3月9日金曜日

MySQL トランザクション中のWHERE句無しのDELETE文

・mysqlではWHERE句の無いDELETEをTRUNCATEとして処理する。
・TRUNCATEはトランザクションセーフでない(>トランザクション中に実行するとエラー)
・ただしWHERE句無しDELETEはトランザクション中でも使える。

これはどういうことか確認。

マニュアルでは、AUTOCOMMITモード(つまりtransactionのbegin - commit(rollback)内でない)場合はTRUNCATEと同様に働くとのこと。
WHERE 節が指定されていない DELETE では、すべてのレコードが削除されます。AUTOCOMMIT モードで実行された場合、WHERE 節なしの DELETE は TRUNCATE と同じように動作します。
MySQL4.1 リファレンス6.4.5. DELETE 構文

つまりトランザクション中のWHERE句なしDELETEは、TRUNCATEに置き換わらず、通常のDELETEとして処理されるということか。

上記リファレンスの文面が MySQL5.1ではDELETEにもTRUNCATEにも載ってなくてちょっと混乱した。