TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATEはテーブル群から全ての行を素早く削除します。 各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。 さらに、その後にVACUUM操作を行うことなく、このコマンドはディスク領域を即座に回収します。 このコマンドは、大きなテーブルを対象とする場合に最も有用です。
空にするテーブルの名前です(スキーマ修飾名も可)。 テーブル名の前にONLYが指定されている場合、そのテーブルのみを空にします。 ONLYが指定されていない場合、そのテーブルとそのすべての子テーブル(もしあれば)を空にします。 省略することもできますが、テーブル名の後に*を指定することで、明示的に継承するテーブルも含まれることを示すことができます。
消去されるテーブルの列により所有されるシーケンスを自動的に再起動させます。
シーケンスの値を変更しません。これがデフォルトです。
指定されたテーブル、または、CASCADEにより削除対象テーブルとされたテーブルを参照する外部キーを持つテーブルすべてを自動的に空にします。
外部キーにより対象のテーブルを参照するテーブルのいずれかがこのコマンドで指定されていない場合、操作を拒否します。 これがデフォルトです。
テーブルを空にするためにはそのテーブルにTRUNCATE権限を持たなければなりません。
TRUNCATEは操作対象の各テーブルに対するACCESS EXCLUSIVEを獲得します。 これは、この他のそのテーブルに対する同時操作をすべてブロックします。 RESTART IDENTITYが指定された場合、初期化対象のシーケンスがあると、それは同様に排他ロックされます。 テーブルへの同時アクセスが必要ならば、代わりに 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操作がトランザクション的に安全に行われます。
つまりそれを囲むトランザクションがコミットされなければ、ロールバックされます。
これは通常のALTER SEQUENCE RESTARTとは異なる動作です。
トランザクションがロールバックされる前に、初期化したシーケンスに対してさらにシーケンス操作を行う場合には注意してください。
シーケンスに対するこれらの操作の影響はロールバックされますが、currval()
への影響はロールバックされません。
つまりトランザクションの後、currval()
は、シーケンス自体と値とが一貫性のない状態になっていたとしても、失敗したトランザクションの内側で得た最後のシーケンス値を継続して反映します。
これは、失敗したトランザクションの後のcurrval()
の通常の動作と同じです。
bigtableテーブルおよびfattableテーブルを空にします。
TRUNCATE bigtable, fattable;
以下も同じですが、ここでは関連するシーケンスジェネレータをすべてリセットします。
TRUNCATE bigtable, fattable RESTART IDENTITY;
othertableテーブル、および、外部キー制約によりothertableを参照するすべてのテーブルを空にします。
TRUNCATE othertable CASCADE;