TRUNCATE [ TABLE ] [ ONLY ] name [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATEはテーブル群から全ての行を素早く削除します。 各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。 さらに、その後にVACUUM操作を行うことなく、このコマンドはディスク領域を即座に回収します。 このコマンドは、大きなテーブルを対象とする場合に最も有用です。
空にするテーブルの名前です(スキーマ修飾名も可)。 ONLYが指定されている場合、そのテーブルのみを空にします。 ONLYが指定されていない場合、そのテーブルとそのすべての子テーブル(もしあれば)を空にします。
消去されるテーブルの列により所有されるシーケンスを自動的に再起動させます。
シーケンスの値を変更しません。これがデフォルトです。
指定されたテーブル、または、CASCADEにより削除対象テーブルとされたテーブルを参照する外部キーを持つテーブルすべてを自動的に空にします。
外部キーにより対象のテーブルを参照するテーブルのいずれかがこのコマンドで指定されていない場合、操作を拒否します。 これがデフォルトです。
テーブルを空にするためにはそのテーブルにTRUNCATE権限を持たなければなりません。
TRUNCATEは操作対象の各テーブルに対するACCESS EXCLUSIVEを獲得します。 これは、この他のそのテーブルに対する同時操作をすべてブロックします。 テーブルへの同時アクセスが必要ならば、代わりに DELETEコマンドを使用しなければなりません。
そのテーブルが他のテーブルから外部キーで参照されている場合、1つのTRUNCATEでそれらのテーブルをすべて空にするように指定していない限り、TRUNCATEを使用することはできません。 このような場合は、有効性を検査するためにテーブルスキャンが必要になりますが、テーブルスキャンを行うのであれば、このコマンドの利点がなくなるからです。 CASCADEを使用して、自動的にすべての依存テーブルを含めることができます。 しかし、意図しないデータ損失の可能性がありますので、このオプションを使用する時には十分に注意してください。
TRUNCATEは、テーブルに存在するすべてのON DELETEトリガを発行しません。 しかし、ON TRUNCATEトリガを発行します。 テーブルのいずれかにON TRUNCATEトリガが定義されている場合、 何らかの消去が行われる前にすべてのBEFORE TRUNCATEトリガが発行されます。 また、最後の消去がなされた後すべてのAFTER TRUNCATEトリガが発行されます。 トリガは処理されるテーブルの順番(コマンドに列挙されたものが先、その後にカスケードのために追加されたもの)に発行されます。
警告 |
TRUNCATEはMVCC的に安全ではありません。 (MVCCに関する一般的な情報については第13章を参照してください。) 削除の後テーブルはすべてのトランザクションから見て、たとえそのトランザクションが始まる前のスナップショットを使用していたとしても、空になります。 削除が始まる前にテーブルを参照しなかったトランザクションに関してのみ問題となります。 そうしたトランザクションでは少なくとも ACCESS SHAREロックを保持しますので、そのトランザクションが終わるまでTRUNCATEはブロックされます。 このため、トランザクションでは、同一テーブルに対する後の問い合わせにおいてその内容に明らかな矛盾は発生しませんが、削除されたテーブルと他のテーブルとの間の内容に目に見える矛盾が発生します。 |
テーブル内のデータという観点では、TRUNCATEはトランザクション的に安全です。 前後のトランザクションがコミットされなければ消去は安全にロールバックされます。
警告 |
RESTART IDENTITYオプションの使用によって行われるALTER SEQUENCE RESTART操作はすべて、トランザクション外であり、失敗してもロールバックされません。 危険を最小にするために、残るすべてのTRUNCATEの作業が完了してから、こうした操作が行われます。 しかし、TRUNCATEがトランザクションブロックの内部で行われ、後にアボートした場合の危険性は残ります。 以下の例を考えてみます。 BEGIN; TRUNCATE TABLE foo RESTART IDENTITY; COPY foo FROM ...; COMMIT; COPYが途中で失敗した場合、テーブルデータは正確にロールバックされますが、シーケンスはおそらく以前と比べ小さな値になったまま残ります。 これはおそらくキーの重複エラーや後のトランザクションにおける問題を引き起こすでしょう。 これが問題になりそうであれば、RESTART IDENTITYの使用を止め、新しいテーブルの内容が過去より大きいシリアル値を受け付けるようにすることが最善です。 |
bigtableテーブルおよびfattableテーブルを空にします。
TRUNCATE bigtable, fattable;
以下も同じですが、ここでは関連するシーケンスジェネレータをすべてリセットします。
TRUNCATE bigtable, fattable RESTART IDENTITY;
othertableテーブル、および、外部キー制約によりothertableを参照するすべてのテーブルを空にします。
TRUNCATE othertable CASCADE;