LoginSignup
5
5

More than 5 years have passed since last update.

TRUNCATEとDBMS間の違い

Last updated at Posted at 2018-07-08

TRANCATE とは

基本的にテーブルを削除するときは、DELETE TABLEを利用しますね。

delete from [テーブル名];

上記のクエリはrollbackログを残す必要があるので、
対処のレコードが何百万、何千万になってしまうと、
レートデプレッションされたり、ランタイムエラーされたりします。
大容量の時危険なところですね。

その時のため、サポートしているクエリで TRUNCATEがあります。

PostgreSQL 8.4.4文書
TRUNCATEはテーブル群から全ての行を素早く削除します。 各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。 さらに、その後にVACUUM操作を行うことなく、このコマンドはディスク領域を即座に回収します。 このコマンドは、大きなテーブルを対象とする場合に最も有用です。

利用方法

TRUNCATE TABLE [テーブル名];
// for CakePHP2
$this->query('TRUNCATE ' . $this->table . ';');

TRANCATE TABLEDELETE TABLE との違い

TRUNCATE TABLEDELETE 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はトランザクション的に安全です。 前後のトランザクションがコミットされなければ消去は安全にロールバックされます。

👏

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5