表からのデータの削除

表からデータを削除するには、表から 1 つ以上の行を削除するか、表からすべての行を削除するか、表から列をドロップします。

プロシージャー

表内の 1 つ以上の行を削除するには、以下のようにします。

  • WHERE 節を指定した DELETE ステートメントを使用して、検索条件を指定します。

    DELETE ステートメントは、WHERE 文節で指定した検索条件を満たす行の数に応じて、表の行を除去しないか、1 つ以上の行を除去します。

    WHERE 節を指定した DELETE を使用して、選択された行だけを宣言済み一時表から削除することはできますが、作成済みの一時表から削除することはできません。

    次の DELETE ステートメントは、従業員番号が 000060 の各行を YEMP 表から削除します。

    DELETE FROM YEMP
      WHERE EMPNO = '000060';

    このステートメントが実行されると、 Db2 は、検索条件を満たす YEMP 表から行を削除します。

    Db2DELETEステートメントの実行中にエラーが検出されると、データの削除が停止され、SQLCODE変数とSQLSTATE変数のエラーコード、またはSQLCAの関連フィールドが返されます。 表の中のデータは変更されません。

    DELETE が正常に行われると、SQLCA の SQLERRD(3) には削除された行数が 入ります。 この数には、DELETE ステートメントで指定した表の中で削除された行の数だけが含まれてい ます。 CASCADE 規則に従って削除される行 (他の表の行) は、SQLERRD(3) には 含まれません。

表内のすべての行を削除するには、以下のようにします。

  • WHERE 節を指定せずに DELETE ステートメントを使用します。

    セグメント化された表スペースでは、表のすべての行の削除が非常に高速です。

    次の DELETE ステートメントは、YDEPT 表のすべて行を削除します。

    DELETE FROM YDEPT;

    このステートメントを実行すると、この表は残りますが (つまり、表に行を挿入できる)、表の中は空になります。 DELETE ステートメントを使用した場合、その表に対する既存のすべてのビューおよび許可は変更されません。

  • TRUNCATE ステートメントを使用します。

    TRUNCATE ステートメントには、DELETE ステートメントに比べて以下の利点があります。

    • TRUNCATE ステートメントは、削除トリガーを無視できます。
    • TRUNCATE ステートメントは、即時コミットを実行できます。
    • TRUNCATE ステートメントは、表へのストレージの割り振りを保持できます。

    ただし、TRUNCATE ステートメントは、表の ID 列に自動的に生成された値のカウントをリセットしません。 TRUNCATE ステートメントの前に、14872 が次に生成される ID 列の値であった場合は、TRUNCATE ステートメントの後でも 14872 が次に生成される値です。

    既存の削除トリガーに関係なく、古い在庫表のデータを空にする必要があり、その表に割り振られていたスペースを他の用途に使用できるようにする必要があるとします。 次の TRUNCATE ステートメントを使用します。

    TRUNCATE INVENTORY_TABLE
       IGNORE DELETE TRIGGERS
       DROP STORAGE;
    既存の削除トリガーに関係なく、古い在庫表のデータを永続的に空にする必要があり、その表に割り振られているスペースを保持する必要があるとします。 ROLLBACK ステートメントがデータを戻せないように、空にしたデータは完全に使用不可にする必要があります。 次の TRUNCATE ステートメントを使用します。
    TRUNCATE INVENTORY_TABLE
       REUSE STORAGE
       IGNORE DELETE TRIGGERS
       IMMEDIATE;
  • DROP TABLE ステートメントを使用します。

    DROP TABLE では、指定した表および関連するすべてのビューや許可がドロップされ、プランおよびパッケージを無効にすることができます。

表から列をドロップするには、以下のようにします。

  • DROP COLUMN 節を指定して ALTER TABLE ステートメントを使用します。

    表から列をドロップすると、表の定義に対する変更が処理待ちになるため、表スペースは通知 REORG ペンディング状況 (AREOR) になります。 処理待ちの変更が適用される (SHRLEVEL CHANGE または REFERENCE オプションを指定して REORG ユーティリティーを実行する) と、表から列がドロップされ、それに依存するパッケージや、動的ステートメント・キャッシュ内のステートメントがあれば、すべて無効になります。