TRUNCATE — 1テーブルまたはテーブル群を空にする
TRUNCATE [ TABLE ] [ ONLY ] name
[ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATE
はテーブル群から全ての行を素早く削除します。
各テーブルに対して条件指定のないDELETE
コマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。
さらに、その後にVACUUM
操作を行うことなく、このコマンドはディスク領域を即座に回収します。
このコマンドは、大きなテーブルを対象とする場合に最も有用です。
name
空にするテーブルの名前です(スキーマ修飾名も可)。
テーブル名の前にONLY
が指定されている場合、そのテーブルのみを空にします。
ONLY
が指定されていない場合、そのテーブルとそのすべての子テーブル(もしあれば)を空にします。
オプションで、テーブル名の後に*
を指定することで、明示的に継承するテーブルも含まれることを示すことができます。
RESTART IDENTITY
消去されるテーブルの列により所有されるシーケンスを自動的に再開始させます。
CONTINUE IDENTITY
シーケンスの値を変更しません。これがデフォルトです。
CASCADE
指定されたテーブル、または、CASCADE
により削除対象テーブルとされたテーブルを参照する外部キーを持つテーブルすべてを自動的に空にします。
RESTRICT
外部キーにより対象のテーブルを参照するテーブルのいずれかがこのコマンドで指定されていない場合、操作を拒否します。 これがデフォルトです。
テーブルを空にするためにはそのテーブルにTRUNCATE
権限を持たなければなりません。
TRUNCATE
は操作対象の各テーブルに対するACCESS EXCLUSIVE
ロックを獲得します。
これは、この他のそのテーブルに対する同時操作をすべてブロックします。
RESTART IDENTITY
が指定された場合、初期化対象のシーケンスがあると、それは同様に排他ロックされます。
テーブルへの同時アクセスが必要ならば、代わりに DELETE
コマンドを使用しなければなりません。
そのテーブルが他のテーブルから外部キーで参照されている場合、その同じコマンドでそれらのテーブルをすべて空にするように指定していない限り、TRUNCATE
を使用することはできません。
このような場合に有効性を検査するならばテーブルスキャンが必要になりますが、テーブルスキャンを行うのであれば、このコマンドの利点がなくなるからです。
CASCADE
オプションを使用して、自動的にすべての依存テーブルを含めることができます。
しかし、意図しないデータ損失の可能性がありますので、このオプションを使用する時には十分に注意してください。
空にするテーブルがパーティションの場合、兄弟のパーティションには手をつけませんが、参照しているテーブルすべてとそのパーティションすべてに対しては、区別することなくカスケードが起こります。
TRUNCATE
は、テーブルにON DELETE
トリガがあっても、それを発行しません。
しかし、ON TRUNCATE
トリガを発行します。
テーブルのいずれかにON TRUNCATE
トリガが定義されている場合、何らかの消去が行われる前にすべてのBEFORE TRUNCATE
トリガが発行されます。
また、最後の消去がなされ、シーケンスが初期化された後すべてのAFTER TRUNCATE
トリガが発行されます。
トリガは処理されるテーブルの順番(コマンドに列挙されたものが先、その後にカスケードのために追加されたもの)に発行されます。
TRUNCATE
はMVCC的に安全ではありません。
同時実行中のトランザクションが、削除の前に取得したスナップショットを使っている場合、削除の後、テーブルはそのトランザクションからは空に見えます。
(詳しくは第13章を参照してください。)
テーブル内のデータという観点では、TRUNCATE
はトランザクション的に安全です。
前後のトランザクションがコミットされなければ消去は安全にロールバックされます。
RESTART IDENTITY
が指定された場合、暗黙的にALTER SEQUENCE RESTART
操作がトランザクション的に行われます。
つまりそれを囲むトランザクションがコミットされなければ、ロールバックされます。
これは通常のALTER SEQUENCE RESTART
とは異なる動作です。
トランザクションがロールバックされる前に、初期化したシーケンスに対してさらにシーケンス操作を行う場合には注意してください。
シーケンスに対するこれらの操作の影響はロールバックされますが、currval()
への影響はロールバックされません。
つまりトランザクションの後、currval()
は、シーケンス自体と値とが一貫性のない状態になっていたとしても、失敗したトランザクションの内側で得た最後のシーケンス値を継続して反映します。
これは、失敗したトランザクションの後のcurrval()
の通常の動作と同じです。
現在のところ、TRUNCATE
は外部テーブルに対してはサポートされません。
このため、指定のテーブルの子孫に外部テーブルがあった場合、コマンドは失敗します。
bigtable
テーブルおよびfattable
テーブルを空にします。
TRUNCATE bigtable, fattable;
以下も同じですが、ここでは関連するシーケンスジェネレータをすべてリセットします。
TRUNCATE bigtable, fattable RESTART IDENTITY;
othertable
テーブル、および、外部キー制約によりothertable
を参照するすべてのテーブルを空にします。
TRUNCATE othertable CASCADE;
標準SQL:2008には、TRUNCATE TABLE
という構文のtablename
TRUNCATE
コマンドが含まれます。
CONTINUE IDENTITY
/RESTART IDENTITY
句も標準に記載され、関連してはいるのですが、若干異なります。
標準では、このコマンドの同時実行に関する動作の一部は実装に依存するものとされています。
このため、上記注釈を検討し、必要に応じて他の実装と比べなければなりません。