DELETE ステートメント

DELETE ステートメントは、 表、ニックネーム、またはビュー、あるいは指定した全選択の基礎表、 ニックネーム、またはビューから、行を削除します。

ニックネームから行を削除すると、 そのニックネームの参照先のデータ・ソース・オブジェクトから行を削除することになります。 ビューから行を削除すると、 このビューに対する削除操作に INSTEAD OF トリガーが定義されていない場合は、 そのビューの基本となる表から行を削除することになります。 このようなトリガーが定義されている場合は、トリガーが代わりに実行されます。

このステートメントには、以下の 2 つの形式があります。
  • 検索 (Searched) DELETE 形式は、 1 つまたは複数の行を削除するのに使用します (削除する行は検索条件によって、自由に限定できます)。
  • 位置指定 (Positioned) DELETE 形式は、 1 行だけを削除する場合に使用します (削除される行は、カーソルの現在位置によって決まります)。

呼び出し

DELETE ステートメントはアプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

このステートメントのどの形式を実行する場合も、ステートメントの許可 ID に、 以下の権限が少なくとも 1 つ含まれている必要があります。
  • 削除する行を含む表、ビュー、またはニックネームに対する DELETE 特権
  • 削除する行を含む表、ビュー、またはニックネームに対する CONTROL 特権
  • 行を削除する表、ビュー、またはニックネームが含まれるスキーマに対する DELETEIN 特権
  • 行を削除する表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS 権限
  • DATAACCESS 権限
検索 DELETE ステートメントを実行する場合、 副照会で参照される表、ビュー、またはニックネームのそれぞれに対して、 ステートメントの許可 ID に、 以下の権限が少なくとも 1 つ含まれている必要があります。
  • SELECT 特権
  • CONTROL 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS 権限
  • DATAACCESS 権限
ステートメントを処理するために使用されるパッケージが SQL92 規則を使用してプリコンパイルされる場合 (SQL92E または MIA の値を指定したオプション LANGLEVEL) で、 検索 DELETE ステートメント形式の search-condition に表またはビューの列への参照が含まれている場合には、 このステートメントの許可 ID の特権には以下の権限のうち少なくとも 1 つが含まれている必要があります。
  • SELECT 特権
  • CONTROL 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
  • 表またはビューが含まれるスキーマに対するスキーマ DATAACCESS 権限
  • DATAACCESS 権限

指定した表またはビューが ONLY キーワードの後にくる場合、 ステートメントの許可 ID が持つ特権にも、 指定した表またはビューの副表またはサブビューごとに SELECT 特権が含まれている必要があります。

静的 DELETE ステートメントの場合、グループ特権は検査されません。

削除操作の対象がニックネームの場合は、データ・ソースのオブジェクトに対する特権は、 ステートメントがデータ・ソースで実行されるまで考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、 データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。

構文 (検索条件付き削除)

構文図を読む構文図をスキップするDELETE FROMtable-nameview-nameperiod-clausenicknameONLY(table-nameview-name)(fullselect)correlation-clauseinclude-columnsassignment-clauseWHEREsearch-conditionorder-by-clauseoffset-clausefetch-clause1WITHRRRSCSUR
period-clause
構文図を読む構文図をスキップするFOR PORTION OF BUSINESS_TIME FROMvalue1TOvalue2
include-columns
構文図を読む構文図をスキップするINCLUDE( ,column-namedata-type )
注:
  • 1 period-clause を指定する場合は、fetch-clause を指定できません。

構文 (位置指定削除)

構文図を読む構文図をスキップするDELETE FROMtable-nameview-namenicknameONLY(table-nameview-name)correlation-clauseWHERE CURRENT OFcursor-name
correlation-clause
構文図を読む構文図をスキップするAScorrelation-name (column-name)

説明

FROM table-nameview-namenickname、または (fullselect)
削除操作の対象のオブジェクトを指定します。名前は、以下のいずれかのオブジェクトを示すものでなければなりません。
  • 現行サーバーでカタログ内に存在する表またはビュー
  • remote-object-name を使用して指定されたリモート・サーバーにある表またはビュー
オブジェクトは、カタログ表、システム保守マテリアライズ照会表、読み取り専用ビューであってはなりません。

table-name が型付き表である場合は、 このステートメントを使用して、その表またはそれに関係する副表の行を削除できます。

view-name が型付きビューである場合は、このステートメントを使用して、 その基礎表の行またはそのビューに関係するサブビューの基礎表を削除できます。 view-name が基礎表 (型付き表) を伴う通常のビューである場合、 このステートメントを使用して、 その型付き表またはそれに関係する副表の行を削除できます。

削除操作のオブジェクトが全選択である場合、CREATE VIEW ステートメントの説明の『注』にある『削除可能ビュー』という項目で定義されているように、全選択が削除可能になっている必要があります。

テンポラル表に関する追加の制約事項、および削除操作のターゲットとしてビューまたは全選択を使用する場合の追加の制約事項については、『注』セクションの『システム期間テンポラル表に関する考慮事項』および『アプリケーション期間テンポラル表に関する考慮事項』を参照してください。

WHERE 節内で参照できるのは、指定された表の列だけです。 位置指定 DELETE の場合は、FROM 節に指定されているのと同じ表またはビューを、関連するカーソルにも ONLY を使用せずに指定しなければなりません。

FROM ONLY (table-name)
型付き表の場合に適用できます。 ONLY キーワードは、指定された表のデータだけにステートメントを適用し、 その表に関係する副表の行は削除されないことを指定します。 位置指定 DELETE の場合は、FROM 節に指定されているのと同じ表を、 関連するカーソルにも ONLY を使用して指定しなければなりません。 table-name が型付き表でない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
FROM ONLY (view-name)
このステートメントは型付きビューのみに適用されます。 ONLY キーワードは、 指定されたビューのデータだけにこのステートメントが適用されることを指定します。 サブビューの行は、このステートメントでは削除されません。 位置指定 DELETE の場合は、FROM 節に指定されているのと同じビューを、 関連するカーソルにも ONLY を使用して指定しなければなりません。 view-name が型付きビューでない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
period-clause
期間節が削除操作のターゲットに適用されることを指定します。
削除操作のターゲットがビューである場合、 以下の条件がビューに適用されます。
  • ビュー定義の外部全選択の FROM 節には、 アプリケーション期間テンポラル表への直接または間接的な参照を含める必要があります (SQLSTATE 42724M)。
  • ビューに関して INSTEAD OF DELETE トリガーが定義されていてはなりません (SQLSTATE 428HY)。
FOR PORTION OF BUSINESS_TIME
これを指定すると、行の中の期間節で指定した期間の一部分についてのみ、行値に削除が適用されます。 表には期間 BUSINESS_TIME が存在していなければなりません (SQLSTATE 4274M)。BUSTIMESENSITIVE BIND オプションが YES に設定されている際に、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値が NULL でない場合には、FOR PORTION OF BUSINESS_TIME を指定することはできません (SQLSTATE 428HY)。
FROM value1 TO value2
これを指定すると、value1 から value2 までで指定した期間について、行に削除が適用されます。 value1value2 以上である場合、または value1 または value2 が NULL 値である場合には、行は削除されません (SQLSTATE 02000)。
FROM value1 TO value2 で指定した期間では、削除のターゲットの行に含まれる期間 BUSINESS_TIME は、以下のいずれかの状態になります。
  • 開始列の値が value1 より小さく、 終了列の値が value1 より大きい場合には、指定期間の開始点をオーバーラップしています。
  • 終了列の値が value2 以上で、 開始列の値が value2 より小さい場合には、指定期間の終了点をオーバーラップしています。
  • BUSINESS_TIME の開始列の値が value1 以上で、 対応する終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
  • 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
  • この行に含まれる期間が指定期間の開始および終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
  • BUSINESS_TIME の両方の列が value1 以下、または value2 以上である場合には、この期間に含まれません。
行に含まれる期間 BUSINESS_TIME が指定期間に含まれない場合には、行は削除されません。 それ以外の場合は、期間 BUSINESS_TIME の列の値がどのように指定期間とオーバーラップするかに基づいて、以下のように削除が適用されます。
  • 行に含まれる期間 BUSINESS_TIME が指定期間内に完全に含まれる場合には、その行は削除されます。
  • 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の開始とオーバーラップする場合には、次のように処理されます。
    • その行は削除されます。
    • その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
  • 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の終了とオーバーラップする場合には、次のように処理されます。
    • その行は削除されます。
    • その行の元の値を使用して行が挿入されます。ただし開始列は value2 に設定されます。
  • 行に含まれる期間 BUSINESS_TIME が指定期間と完全にオーバーラップする場合には、次のように処理されます。
    • その行は削除されます。
    • その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
    • その行の元の値を使用して追加行が挿入されます。ただし開始列は value2 に設定されます。
value1 および value2
各式は、日付データ・タイプ、タイム・スタンプ・データ・タイプ、あるいは日付またはタイム・スタンプのストリング表記として有効なデータ・タイプの値を戻す必要があります (SQLSTATE 428HY)。各式の結果は、指定期間の列のデータ・タイプと比較可能でなければなりません (SQLSTATE 42884)。『代入と比較』に記載した比較規則を参照してください。
それぞれの式には、以下のサポートされているオペランドのいずれかを組み込むことができます (SQLSTATE 428HY)。
  • 定数
  • 特殊レジスター
  • 変数。詳しくは、『ID』の中の『変数の参照』を参照してください。
  • スカラー関数。ただし引数が、サポートされているオペランドである場合 (ただしユーザー定義関数および非 deterministic 関数は使用できません)
  • CAST 指定。ただしキャスト・オペランドが、サポートされているオペランドである場合
  • 算術演算子および算術オペランドを使用する式
correlation-clause
search-condition で、表、ビュー、ニックネームまたは全選択を指定するのに使用できます。 correlation-clause についての説明は、『副選択』の説明にある『table-reference』を参照してください。
include-columns
全選択の FROM 節にネストされているとき、 table-nameview-name などの列と一緒に DELETE ステートメントの中間結果表に組み込まれている列セットを指定します。 include-columns は、 table-nameview-name で指定されている列のリストの最後に付加されます。
INCLUDE
DELETE ステートメントの中間結果表に組み込まれる列のリストを指定します。
column-name
DELETE ステートメントの中間結果表の列を指定します。 名前は、他の組み込み列や、 table-name または view-name の列と同じ名前であってはなりません (SQLSTATE 42711)。
data-type
組み込み列のデータ・タイプを指定します。 データ・タイプは、CREATE TABLE ステートメントでサポートされているものでなければなりません。
assignment-clause
UPDATE ステートメントの assignment-clause の説明を参照してください。 同じ規則が適用されます。 include-columns は、 assignment-clause を使用して設定できる唯一の列です (SQLSTATE 42703)。
WHERE
削除する行を選択する条件を指定します。 この節は、省略するか、検索条件を指定するか、 あるいはカーソルの名前を指定できます。 この節を省略すると、表またはビューのすべての行が削除されます。
search-condition
副照会以外の検索条件の各 column-name (列名) は、 表またはビューの列を指定していなければなりません。

search-condition は、該当の表、ビュー、またはニックネームの各行に適用されます。 search-condition の結果が「真」の行だけが削除されます。

検索条件に副照会が含まれる場合、 その副照会は、search-condition が 1 つの行に適用されるたびに実行され、 その結果は search-condition の適用に使用されるものと見なされます。 実際には、相関参照が含まれていない副照会は一度実行されるのに対し、 相関参照の含まれている副照会は各行ごとに一度ずつ実行しなければならない場合があります。 副照会で DELETE ステートメントの対象の表、 または削除規則が CASCADE あるいは SET NULL の従属表が参照されている場合、 その副照会は行が削除される前に完全に評価されます。

CURRENT OF cursor-name
プログラムの DECLARE CURSOR ステートメントで定義されたカーソルを指定します。 DECLARE CURSOR ステートメントは、DELETE ステートメントよりも前になければなりません。

指定する表、ビュー、またはニックネームは、 そのカーソルの SELECT ステートメントの FROM 節でも指定されていなければならず、 またそのカーソルの結果表が読み取り専用であってはなりません。 (読み取り専用の結果表については、DECLARE CURSOR を参照してください。)

DELETE ステートメントが実行される場合、 カーソルは行の位置になければなりません。その行が削除されます。 削除後、カーソル位置はその結果表の次の行の前になります。 次の行がない場合、カーソル位置は最後の行の後になります。

order-by-clause
offset-clausefetch-clause を適用する行の順序を指定します。offset-clausefetch-clause に基づいて削除される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。order-by-clause の詳細については、order-by-clauseを参照してください。
offset-clause
限定した行のサブセットをスキップして、削除の対象範囲を制限します。offset-clause の詳細については、offset-clauseを参照してください。
fetch-clause
限定した行のサブセットだけに削除の対象範囲を制限します。fetch-clause の詳細については、fetch-clauseを参照してください。
WITH
削除する行を検索しているときに使用される分離レベルを指定します。
RR
反復可能読み取り
RS
読み取り固定
CS
カーソル固定
UR
非コミット読み取り
ステートメントのデフォルト分離レベルは、ステートメントがバインドされている パッケージの分離レベルです。WITH 節はニックネームには影響を与えません。ニックネームは常にステートメントのデフォルトの分離レベルを使用します。

規則

  • トリガー: DELETE ステートメントによってトリガーの実行が引き起こされる場合があります。 トリガーが他のステートメントの実行を引き起こす場合や、 削除された行に起因するエラーが発生する場合があります。 ビューの DELETE ステートメントが INSTEAD OF トリガーの発生を引き起こす場合は、 参照整合性は、トリガーの発生を引き起こしたビューの基礎表に対してではなく、 トリガー内で実行される更新に対して検査されます。
  • 参照整合性: 指定する表または指定するビューの基本表が親である場合、削除のために選択する行は RESTRICT の削除規則との関係において従属であってはならず、DELETE は RESTRICT の削除規則との関係において従属である下層行にカスケードしてはなりません。
    削除操作が RESTRICT の削除規則によって禁止されていなければ、選択された行は削除されます。 選択された行の従属行もすべて影響を受けます。
    • 削除規則が SET NULL の関係において、すべての従属行の外部キーの NULL 可能列は、 NULL 値に設定されます。
    • 削除規則が CASCADE の関係である、すべての従属行も削除されます。 そして、今度はそれらの行に対して前述の規則が適用されます。

    他の参照制約が実施された後で、非 NULL の外部キーが既存の親行を指すようにするために、 NO ACTION の削除規則が検査されます。

  • セキュリティー・ポリシー: 指定された表または指定されたビューの基本表がセキュリティー・ポリシーで保護されている場合、セッション許可 ID は、以下を許可するラベル・ベースのアクセス制御 (LBAC) 信用証明情報を持っている必要があります。
    • すべての保護された列に対する書き込みアクセス (SQLSTATE 42512)
    • 削除のために選択されたすべての行に対する読み取りおよび書き込みアクセス (SQLSTATE 42519)

  • 例 1: DEPARTMENT 表から部門 (DEPTNO) 'D11' を削除します。
       DELETE FROM DEPARTMENT
         WHERE DEPTNO = 'D11'
  • 例 2: DEPARTMENT 表からすべての部門を削除します (つまり、表を空にします)。
       DELETE FROM DEPARTMENT
  • 例 3: EMPLOYEE 表から 1995 年中に売上が 1 つもなかった営業担当員または現場担当員を削除します。
       DELETE FROM EMPLOYEE
         WHERE LASTNAME NOT IN
           (SELECT SALES_PERSON
             FROM SALES
             WHERE YEAR(SALES_DATE)=1995)
             AND JOB IN ('SALESREP','FIELDREP')
  • 例 4: EMPLOYEE 表から、重複している従業員の行をすべて削除します。従業員の行は、ラストネームが一致していれば、重複していると考えられます。従業員の行のファーストネームは、字句順に、できるだけ短くしておきます。
       DELETE FROM
         (SELECT ROWNUMBER() OVER (PARTITION BY LASTNAME ORDER BY FIRSTNME)
           FROM EMPLOYEE) AS E(RN)
           WHERE RN > 1