TRUNCATE ステートメント

TRUNCATE ステートメントは、表からすべての行を削除します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、表、および表階層のすべての副表に対する以下の権限の少なくとも 1 つが含まれていなければなりません。
  • 切り捨てる表に対する DELETE 特権
  • 表が含まれるスキーマに対する DELETEIN 特権
  • 切り捨てる表に対する CONTROL 特権
  • 表が含まれるスキーマに対する DATAACCESS 権限
  • DATAACCESS 権限
表に対して定義されているすべての DELETE トリガーを無視するには、ステートメントの許可 ID によって保持されている特権に、表、および表階層のすべての副表に対する以下の権限の少なくとも 1 つが含まれていなければなりません。
  • 表に対する ALTER 特権
  • 表および表階層のすべての副表が含まれるスキーマに対する ALTERIN 特権
  • 表に対する CONTROL 特権
  • 表および表階層のすべての副表が含まれるスキーマに対する SCHEMAADM 権限
  • DBADM 権限
セキュリティー・ポリシーで保護されている表を切り捨てるには、ステートメントの許可 ID で保持されている特権に、以下の権限の少なくとも 1 つが含まれている必要があります。
  • 表に対する CONTROL 特権
  • DBADM 権限
行アクセス制御がアクティブになっている表を切り捨てるには、ステートメントの許可 ID に、以下の権限の少なくとも 1 つが含まれている必要があります。
  • 表に対する CONTROL 特権
  • DBADM 権限

構文

Read syntax diagramSkip visual syntax diagram TRUNCATE TABLE table-name DROP STORAGEREUSE STORAGE IGNORE DELETE TRIGGERSRESTRICT WHEN DELETE TRIGGERS CONTINUE IDENTITY IMMEDIATE1
Notes:
  • 1 IMMEDIATE is optional only for column-organized tables.

説明

table-name
切り捨てる表を指定します。 この名前は、現行のサーバーに存在する表を指定するものでなければなりませんが (SQLSTATE 42704)、カタログ表 (SQLSTATE 42832)、ニックネーム (SQLSTATE 42809)、ビュー、副表、ステージング表、システムによって保守されるマテリアライズ照会表、システム期間テンポラル表 (SQLSTATE 428HZ)、および範囲がクラスター化された表 (SQLSTATE 42807) を指定することはできません。

table-name が表階層のルート表である場合は、表階層内のすべての表が切り捨てられます。

DROP STORAGE または REUSE STORAGE
表に割り振られている既存のストレージをドロップするか、再利用するかを指定します。 デフォルトは DROP STORAGE です。
DROP STORAGE
表に割り振られているすべてのストレージが解放され、使用可能になります。 このオプションが (暗黙的または明示的に) 指定された場合、オンライン・バックアップはブロックされます。
REUSE STORAGE
表に割り振られているすべてのストレージは、その表に引き続き割り振られますが、ストレージは空と見なされます。 このオプションは、DMS 表スペース内の表にのみ適用でき、それ以外は無視されます。
IGNORE DELETE TRIGGERS または RESTRICT WHEN DELETE TRIGGERS
表に対して DELETE トリガーが定義されている場合に実行する動作を指定します。 デフォルトは IGNORE DELETE TRIGGERS です。
IGNORE DELETE TRIGGERS
表に対して定義されている DELETE トリガーは、切り捨て操作によってアクティブにされません。
RESTRICT WHEN DELETE TRIGGERS
表に対して DELETE トリガーが定義されている場合はエラーが戻されます (SQLSTATE 428GJ)。
CONTINUE IDENTITY
表に ID 列が存在する場合、生成される次の ID 列の値は、TRUNCATE ステートメントが実行されなかった場合に生成される次の値に進みます。
IMMEDIATE
切り捨て操作が直ちに処理され、取り消しできないことを指定します。 ステートメントは、トランザクション内の最初のステートメントである必要があります (SQLSTATE 25001)。

切り捨てられた表は、同じ作業単位で使用できるように直ちに使用可能になります。 ROLLBACK ステートメントは、TRUNCATE ステートメントの実行後に実行できますが、切り捨て操作は取り消されず、表は、切り捨てられた状態のままになります。 例えば、TRUNCATE IMMEDIATE ステートメントの実行後に表に対して別のデータ変更操作が実行され、その後で ROLLBACK ステートメントが実行された場合、切り捨て操作は取り消されませんが、その他のデータ変更操作はすべて取り消されます。

IMMEDIATE 節は、カラム・オーガナイズ表でのみ除外できます。
カラム・オーガナイズ表に IMMEDIATE が指定されていない場合、TRUNCATE ステートメントを作業単位の最初のステートメントにする必要はなく、ROLLBACK ステートメントを使用して切り捨て操作を元に戻すことができます。
重要: IMMEDIATE 節は、 Db2® バージョン 11.5 モディフィケーションパック 2 以降のバージョンでのみオプションです。

ルール

  • 参照整合性: 参照制約が適用される場合、表、および表階層内のすべての表は、親表であってはなりません (SQLSTATE 428GJ)。 自己参照 RI 制約は許可されます。
  • パーティション表: 表は、データ・パーティションをアタッチするように変更されているので、SET INTEGRITY ペンディング状態であってはなりません (SQLSTATE 55019)。 TRUNCATE ステートメントを実行する前に、表の整合性チェックを実施する必要があります。 論理的にデタッチされたパーティションが表にあってはなりません (SQLSTATE 55057)。 非同期パーティション・デタッチ・タスクは、TRUNCATE ステートメントの実行前に完了していなければなりません。
  • アクセスの排他: 他のセッションは、表に対してカーソルを開いたり、表に対してロックを掛けたりすることはできません (SQLSTATE 25001)。
  • WITH HOLD カーソル: 現行セッションは、表に対して WITH HOLD カーソルを開くことはできません (SQLSTATE 25001)。

  • 表統計: 表の統計は TRUNCATE ステートメントによって変更されません。
  • 削除された行数: SQLCA の SQLERRD(3) は、切り捨て操作の場合は -1 に設定されます。 表から削除された行数は戻されません。
  • カラム・オーガナイズ表では、IMMEDIATE 節が任意指定である場合、IMMEDIATE 節に以下の規則が適用されます。
    • IMMEDIATE オプションを指定しなかった場合、TRUNCATE ステートメントが処理され、その処理を元に戻すことができます。
    • TRUNCATE ステートメントは、トランザクション・スコープ内のどこにでも配置できます。
    • TRUNCATE ステートメントは、トランザクションが完了する前に元に戻すことができます。
    • 切り捨てられた表を、同じ作業単位ですぐに使用することができます。
    • ROLLBACK ステートメントは、IMMEDIATE オプションを指定していない TRUNCATE ステートメントが処理された後で実行できます。 その後 TRUNCATE 操作が元に戻されます。
    • 例えば、IMMEDIATE オプションを指定していない TRUNCATE ステートメントが処理された後で、表に対して別のデータ変更操作が実行され、その後 ROLLBACK ステートメントが実行された場合は、TRUNCATE 操作も元に戻されます。
    • トランザクションが完了すると、ストレージは自動的に非同期で再利用されます。
    • 切り捨て操作は、一括削除操作に似た方法で実行されます。 表から削除された行の数は、SQLERRD(4) で返されます。
    • 基礎となる DELETE ステートメントに WHERE 節が含まれていないため、SQLWARN(5) の値は「W」です。

  • 例 1: 既存のトリガーにかかわらず未使用の在庫表を空にして、その割り振られていたスペースを戻します。
       TRUNCATE TABLE INVENTORY
         IGNORE DELETE TRIGGERS
         DROP STORAGE
         IMMEDIATE
  • 例 2: 既存の DELETE トリガーにかかわらず未使用の在庫表を空にしますが、後で再使用できるように、その割り振られていたスペースを保持します。
       TRUNCATE TABLE INVENTORY
          REUSE STORAGE
          IGNORE DELETE TRIGGERS
          IMMEDIATE
  • 例 3: カラム・オーガナイズ表に IMMEDIATE が指定されていない場合、TRUNCATE ステートメントを作業単位の最初のステートメントにする必要はなく、ROLLBACK ステートメントを使用して切り捨て操作を元に戻すことができます。
    SELECT COUNT(*) FROM TAB10;
    TRUNCATE TABLE TAB10;
    SELECT COUNT(*) FROM TAB10;
    ROLLBACK;
    IMMEDIATE を指定していない TRUNCATE ステートメントは作業単位の最初のステートメントではないことと、IMMEDIATE を指定していない TRUNCATE ステートメントはロールバックできることに注目してください。