TRANCATE とは
基本的にテーブルを削除するときは、DELETE TABLE
を利用しますね。
delete from [テーブル名];
上記のクエリはrollbackログを残す必要があるので、
対処のレコードが何百万、何千万になってしまうと、
レートデプレッションされたり、ランタイムエラーされたりします。
大容量の時危険なところですね。
その時のため、サポートしているクエリで TRUNCATE
があります。
PostgreSQL 8.4.4文書
TRUNCATEはテーブル群から全ての行を素早く削除します。 各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。 さらに、その後にVACUUM操作を行うことなく、このコマンドはディスク領域を即座に回収します。 このコマンドは、大きなテーブルを対象とする場合に最も有用です。
利用方法
TRUNCATE TABLE [テーブル名];
// for CakePHP2
$this->query('TRUNCATE ' . $this->table . ';');
TRANCATE TABLE と DELETE TABLE との違い
TRUNCATE TABLE とDELETE TABLEの違いは次の通りです。
・TRUNCATE TABLEはDML(Data Manupulation Language) ではなく、DDL(Data Definition Language)です。 そのため、DELETEとは別にトランザクション内に入れてもROLLBACKできません。
・TRUNCATE TABLEはAUTO_INCREMENT値も初期化されます。
・TRUNCATE TABLEはWHERE条件を利用できません。 単純にテーブルをスキーマだけ残してそのまま丸ごと空けます。
・TRUNCATE TABLEは個別レコードの削除に対してロギングせずに全てのレコードをテーブルから削除します。 なので、システムログ及びトランザクションログのリソースをより少なく利用して、もっとクエリが早いです。
PostgreSQLは TRUNCATEもちゃんとトランザクションでROLLBACKできます。
OracleとMySQLとは違いに、PostgreSQLはTRUNCATEもちゃんとトランザクションでROLLBACKできます。
面白いのは、他のDDL(CREATE TABLEなど)もトランザクションが聞きます。
原理的な理由はまだ把握してませんが、DBMS間の こんな差は 注意が必要です!
PostgreSQL 8.4.4文書
テーブル内のデータという観点では、TRUNCATEはトランザクション的に安全です。 前後のトランザクションがコミットされなければ消去は安全にロールバックされます。
👏