PostgreSQL 9.1.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# TRUNCATE

## 名前

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`コマンドを使用しなければなりません。

そのテーブルが他のテーブルから外部キーで参照されている場合、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;

## 互換性

標準SQL:2008には、`TRUNCATE TABLE `tablename``という構文の`TRUNCATE`コマンドが含まれます。 `CONTINUE IDENTITY`/`RESTART IDENTITY`句も標準に記載され、関連してはいるのですが、若干異なります。 標準では、このコマンドの同時実行に関する動作の一部は実装に依存するものとされています。 このため、上記注意を検討し、必要に応じて他の実装と比べなければなりません。

前のページ | ホーム | 次のページ
START TRANSACTION | 上に戻る | UNLISTEN