DELETE
目的
-
非パーティション表またはパーティション表
-
ビューの非パーティション実表またはパーティション実表
-
書込み可能なマテリアライズド・ビューの非パーティション・コンテナ表またはパーティション・コンテナ表
-
更新可能なマテリアライズド・ビューの非パーティション・マスター表またはパーティション・マスター表
前提条件
表から行を削除する場合、その表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、その表に対するDELETE
オブジェクト権限が必要です。
更新可能なマテリアライズド・ビューから行を削除する場合、そのマテリアライズド・ビューが自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、そのマテリアライズド・ビューに対するDELETE
オブジェクト権限が必要です。
ビューの実表から行を削除する場合、そのビューが含まれるスキーマの所有者には、その実表に対するDELETE
オブジェクト権限が必要です。また、他のスキーマ内にビューが存在している場合は、そのビューに対するDELETE
オブジェクト権限が必要です。
DELETE
ANY
TABLE
システム権限を持っている場合、任意の表、表パーティションまたは任意のビューの実表から行を削除できます。
リモート・データベースのオブジェクトの行を削除するには、オブジェクトのREAD
またはSELECT
オブジェクト権限も必要です。
SQL92_SECURITY
初期化パラメータがTRUE
に設定され、DELETE
操作がwhere_clause
の列などの表の列を参照する場合、行を削除するオブジェクトのSELECT
オブジェクト権限も必要です。
表のファンクション索引が無効な状態にあるとき、表から行を削除できません。まず、ファンクション索引を検証する必要があります。
構文
delete::=
(DML_table_expression_clause::=、where_clause::=、returning_clause::=、error_logging_clause::=、from_using_clause::=)
DML_table_expression_clause::=を参照
(partition_extension_clause::=、subquery::=、subquery_restriction_clause::=、table_collection_expression::=)
partition_extension_clause::=
subquery_restriction_clause::=
table_collection_expression::=
from_using_clause::=
where_clause::=
returning_clause::=
error_logging_clause::=
セマンティクス
from_clause
FROM
句を使用すると、行を削除するデータベース・オブジェクトを指定できます。
ONLY
構文は、ビューのみに関連します。FROM
句のビューがビューの階層に属し、そのいずれのサブビューからも行を削除しない場合は、ONLY
句を使用します。
DML_table_expression_clause
この句を使用すると、データを削除するオブジェクトを指定できます。
schema
表またはビューが含まれているスキーマを指定します。schema
を指定しない場合、表またはビューは自分のスキーマにあるとみなされます。
table | view | materialized view | subquery
行を削除する表、ビュー、マテリアライズド・ビュー、列または副問合せの結果の列の名前を指定します。
更新可能なビューから行を削除すると、実表から行が削除されます。
読取り専用マテリアライズド・ビューからは行を削除できません。書込み可能なマテリアライズド・ビューから行を削除する場合、基礎となるコンテナ表から行が削除されます。ただし、その削除は次のリフレッシュ操作で上書きされます。マテリアライズド・ビュー・グループ内の更新可能なマテリアライズド・ビューから行を削除する場合、マスター表の対応する行も削除されます。
table
、view
の実表またはmaterialized_view
のマスター表に、1列以上のドメイン索引列が含まれる場合は、この文によって適切な索引タイプの削除ルーチンが実行されます。
関連項目:
これらのルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。
表に対してDELETE
文を実行すると、その表に定義されているDELETE
トリガーが起動されます。
行の削除によって解放される表や索引のすべての領域は、表および索引によって引き続き保持されます。
partition_extension_clause
オブジェクト内にある削除対象のパーティションまたはサブパーティションの名前またはパーティション・キー値を指定します。
パーティション・オブジェクトから値を削除する場合、そのパーティション名を指定する必要はありません。ただし、パーティション名を指定した方が、複雑なwhere_clause
より効率が上がることがあります。
関連項目:
「パーティション表と索引の参照」および「パーティションからの行の削除: 例」を参照してください。
dblink
オブジェクトが格納されているリモート・データベースへのデータベース・リンクの完全名または部分名を指定します。Oracle Databaseの分散機能を使用している場合にのみ、リモート・オブジェクトから行を削除できます。
ノート:
Oracle Database 12cリリース2 (12.2)以降、DELETE
文は、バインド変数としてリモートLOBロケータを受け入れます。詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』の「分散LOB」の章を参照してください。
関連項目:
データベース・リンクの参照方法に関する「リモート・データベース内のオブジェクトの参照」、および「リモート・データベースからの行の削除: 例」を参照してください。
dblink
を省略した場合、オブジェクトがローカル・データベース上にあるとみなされます。
subquery_restriction_clause
subquery_restriction_clause
を使用すると、次のいずれかの方法で副問合せを制限できます。
WITH READ ONLY
WITH READ ONLY
を指定すると、表またはビューを更新禁止にできます。
WITH CHECK OPTION
WITH CHECK OPTION
を指定すると、副問合せに含まれない行を生成する表またはビューの変更を禁止できます。この句をDML文の副問合せ内で使用する場合、FROM
句内の副問合せには指定できますが、WHERE
句内の副問合せには指定できません。
CONSTRAINT constraint
CHECK OPTION
制約の名前を指定します。この識別子を省略した場合は、Oracleによって自動的にSYS_C
n
という形式の制約名が割り当てられます(nはデータベース内で制約名を一意にするための整数)。
table_collection_expression
table_collection_expression
を使用すると、問合せおよびDML操作で、collection_expression
値を表として扱うことができます。collection_expression
には、副問合せ、列、ファンクションまたはコレクション・コンストラクタのいずれかを指定できます。その形式にかかわらず、集合値(ネストした表型またはVARRAY型の値)を戻す必要があります。このようなコレクションの要素抽出プロセスをコレクション・ネスト解除といいます。
TABLE
コレクション式を親表と結合する場合は、オプションのプラス(+)には大きな意味があります。+を指定すると、その2つの外部結合が作成され、コレクション式がNULLの場合でも、外部表の行が問合せで戻されるようになります。
ノート:
以前のリリースのOracleでは、collection_expression
が副問合せの場合、table_collection_expression
をTHE
subquery
と表現していました。現在、このような表現方法は非推奨になっています。
相関副問合せでtable_collection_expression
を使用すると、他の表に存在する値で行を削除できます。
関連項目:
collection_expression
行を削除するオブジェクトからネストした表の列を選択する副問合せを指定します。
dml_table_expression_clause句の制限事項
この句には、次の制限事項があります。
-
view
またはmaterialized_view
のtable
(実表またはマスター表)にIN_PROGRESS
またはFAILED
のマークが付いたドメイン索引がある場合、この文は実行できません。 -
関係する索引パーティションが
UNUSABLE
とマークされている場合は、パーティションに挿入できません。 -
DML_table_expression_clause
の副問合せでは、ORDER
BY
句を指定できません。 -
ビューを定義する問合せに次のいずれかの構造体が含まれている場合は、
INSTEAD
OF
トリガーを使用する場合を除いて、ビューから行を削除できません。- 集合演算子
DISTINCT
演算子- 集計ファンクションまたは分析ファンクション
GROUP
BY
、ORDER
BY
、MODEL
、CONNECT
BY
またはSTART
WITH
句SELECT
構文のリストにあるコレクション式SELECT
構文のリストにある副問合せWITH READ ONLY
が指定された副問合せ- 結合(一部の例外を除く。詳細は、『Oracle Database管理者ガイド』を参照してください。)
UNUSABLE
のマークが付いている索引、索引パーティションまたは索引サブパーティションを指定する場合、SKIP_UNUSABLE_INDEXES
初期化パラメータがtrue
に設定されていないかぎり、DELETE
文は正常に実行されません。
関連項目:
t_alias
文中で参照する表、ビュー、マテリアライズド・ビュー、副問合せまたはコレクション値の相関名を指定します。DML_table_expression_clause
がいずれかのオブジェクト型属性またはオブジェクト型メソッドを参照する場合、この別名が必要です。通常、別名は相関問合せを持つDELETE
文で使用されます。
from_using_clause
この句を使用すると、DELETE
によって削除される行をフィルタできます。where_clause
で結合条件を指定します。(+)を使用してソース表をターゲットに外部結合できます。ターゲット表を結合の外部表にすることはできません。
多数の表、ビューおよびインライン・ビューを結合できます。where_clause
で結合条件を指定するか、join_clause
を使用してANSI結合構文でこれらを相互に結合します。
dml_table_expression_clause
およびfrom_using_clause
で同じ表を指定できます。その場合は、それらが一意の別名を持っている必要があります。
例: 直接結合による削除
この例では、表t
と表s
の間の結合条件によって、t
から削除する行を決定しています。
DELETE FROM t FROM s WHERE t.t1 = s.s1;
結合条件によって同じターゲット行が複数回選択されていても、DELETE
は成功し、削除カウントには削除された行数が正しく反映されます。
結合ビューのDELETE
では、いずれかの表がキー保存している必要があります。その表が削除対象として使用されます。キー保存している表が複数ある場合、FROM
句で検出される最初のキー保持表が削除対象として使用されます。そのような表が存在していない場合は、エラーORA-01752
が発生します。削除対象が明確であるため、このような制限は直接結合構文にはありません。
DELETE
の直接結合のセマンティクスと制限事項は、SELECT
のfrom_clause
およびwhere_clause
と同じです。ターゲット表に対するトリガーは通常どおり起動します。
制限事項
-
dml_table_expression_clause
を使用したANSI結合構文の指定はできません。ただし、FROM
句で指定された表の間ではANSI結合構文を指定できます。右外部結合と完全外部結合は許可されません。 -
FROM
句でlateralビューを使用できますが、削除対象からの列は参照できません。これは、外部結合になる可能性があります。 -
from_using_clause
が存在する場合、dml_table_expression_clause
では1つの表、ビューまたはマテリアライズド・ビューのみを指定できます。 -
hint
句を使用すると、from_using_clause
が関与する結合についてオプティマイザに向けた指示を指定できます。
where_clause
where_clause
を使用すると、条件を満たす行のみを削除できます。この条件は、行を削除するオブジェクトを参照したり、副問合せを含むことができます。Oracle Databaseの分散機能を使用している場合にのみ、リモート・オブジェクトから行を削除できます。condition
の構文は、「条件」を参照してください。
この句がリモート・オブジェクトを参照するsubquery
を含む場合、参照がローカル・データベース上でオブジェクトにループバックしないかぎり、DELETE
はパラレルで実行されます。ただし、DML_table_expression_clause
のsubquery
がリモート・オブジェクトを参照する場合は、DELETE
操作はシリアルで実行されます。詳細は、「CREATE
TABLE
」の「parallel_clause」を参照してください。
dblink
を省略した場合、表またはビューがローカル・データベース上にあるとみなされます。
where_clause
を省略した場合、オブジェクトのすべての行が削除されます。
returning_clause
この句を使用すると、削除された列から値を戻すことができるため、DELETE
文の後でSELECT
文を実行する必要がなくなります。
この句を使用すると、DML文に影響される行を取り出すことができます。この句は、表、マテリアライズド・ビュー、および単一の実表を持つビューに指定できます。
returning_clause
を指定したDML文を単一行に実行すると、影響された行、ROWID、および処理された行へのREF
を使用している列式が取り出され、ホスト変数またはPL/SQL変数に格納されます。
returning_clause
を指定したDML文を複数行に実行すると、式の値、ROWIDおよび処理された行に関連するREF
がバインド配列に格納されます。
expr
expr
リストの各項目は、適切な構文で表す必要があります。
INTO
INTO
句を指定すると、変更された行の値を、data_item
リストに指定する変数に格納できます。
data_item
data_item
はそれぞれ、取り出したexpr
値を格納するためのホスト変数またはPL/SQL変数です。
RETURNING
リストの各式については、INTO
リストに、対応する型に互換性があるPL/SQL変数またはホスト変数を指定する必要があります。
RETURNING句の制限事項
RETURNING
句には、次の制限事項があります。
-
expr
に次の制限事項があります。-
UPDATE
文およびDELETE
文の場合、各expr
は、単純式または単一セットの集計ファンクション式である必要があります。1つのreturning_clause
内に単純式と単一セットの集計ファンクション式を混在させることはできません。INSERT
文の場合、各expr
は単純式である必要があります。INSERT
文のRETURNING
句では、集計ファンクションはサポートされていません。 -
単一セットの集計ファンクション式を
DISTINCT
キーワードに含めることはできません。
-
-
expr
のリストに主キー列または他のNOT
NULL
列が含まれている場合は、表にBEFORE
UPDATE
トリガーが定義されていると、UPDATE文の実行に失敗します。 -
マルチテーブル・インサートでは
returning_clause
を指定できません。 -
パラレルDMLまたはリモート・オブジェクトにはこの句を使用できません。
-
LONG
型を取り出すことはできません。 -
INSTEAD
OF
トリガーが定義されたビューに対して指定することはできません。
関連項目:
-
BULK
COLLECT
句を使用してコレクション変数に複数の値を戻す場合は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
error_logging_clause
error_logging_clause
のDELETE
文での動作は、INSERT
文の場合と同じです。詳細は、「INSERT
」文の「error_logging_clause」を参照してください。
関連項目:
例
行の削除: 例
次の文は、language_id
列の値がAR
の、サンプル表oe.product_descriptions
からすべての行を削除します。
DELETE FROM product_descriptions WHERE language_id = 'AR';
次の文は、サンプル表hr.employees
から歩合率が10%未満の購買係を削除します。
DELETE FROM employees WHERE job_id = 'SA_REP' AND commission_pct < .2;
次の文は前述の例と同じ結果を表しますが、副問合せを使用します。
DELETE FROM (SELECT * FROM employees) WHERE job_id = 'SA_REP' AND commission_pct < .2;
リモート・データベースからの行の削除: 例
次の文は、データベース・リンクremote
からアクセス可能なデータベース上のユーザーhr
が所有するlocations
表から、指定された行を削除します。
DELETE FROM hr.locations@remote WHERE location_id > 3000;
ネストした表の行の削除: 例
ネストした表の行の削除例は、「表のコレクション: 例」を参照してください。
パーティションからの行の削除: 例
次の例は、sh.sales
表のパーティションsales_q1_1998
から行を削除します。
DELETE FROM sales PARTITION (sales_q1_1998) WHERE amount_sold > 1000;
RETURNING句の使用: 例
次の例は、削除された行からsalary
列を戻し、その結果をバインド配列:bnd1
に格納します。バインド配列は事前に宣言しておく必要があります。
DELETE FROM employees WHERE job_id = 'SA_REP' AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE RETURNING salary INTO :bnd1;
表からのデータの削除: 例
次の文は、product_price_historyという名前の表を作成し、この表にデータを挿入します。
CREATE TABLE product_price_history ( product_id INTEGER NOT NULL, price INTEGER NOT NULL, currency_code VARCHAR2(3 CHAR) NOT NULL, effective_from_date DATE NOT NULL, effective_to_date DATE, CONSTRAINT product_price_history_pk PRIMARY KEY (product_id, currency_code, effective_from_date) ) PARTITION BY RANGE (effective_from_date) ( PARTITION p0 VALUES less than (DATE'2015-01-02'), PARTITION p1 VALUES less than (DATE'2015-01-03'), PARTITION p2 VALUES less than (DATE'2015-01-04') ); INSERT INTO product_price_history WITH prices AS ( SELECT 1, 100, 'USD', DATE'2015-01-01', DATE'2015-01-02' FROM dual UNION ALL SELECT 1, 60, 'GBP', DATE'2015-01-01', DATE'2015-01-02' FROM dual UNION ALL SELECT 1, 110, 'EUR', DATE'2015-01-01', DATE'2015-01-02' FROM dual UNION ALL SELECT 1, 101, 'USD', DATE'2015-01-02', DATE'2015-01-03' FROM dual UNION ALL SELECT 1, 62, 'GBP', DATE'2015-01-02', DATE'2015-01-03' FROM dual UNION ALL SELECT 1, 109, 'EUR', DATE'2015-01-02', DATE'2015-01-03' FROM dual UNION ALL SELECT 1, 105, 'USD', DATE'2015-01-03', NULL FROM dual UNION ALL SELECT 1, 61, 'GBP', DATE'2015-01-03', NULL FROM dual UNION ALL SELECT 1, 107, 'EUR', DATE'2015-01-03', NULL FROM dual UNION ALL SELECT 2, 30, 'USD', DATE'2015-01-01', DATE'2015-01-03' FROM dual UNION ALL SELECT 2, 33, 'USD', DATE'2015-01-03', NULL FROM dual UNION ALL SELECT 3, 100, 'GBP', DATE'2015-01-03', NULL FROM dual ) SELECT * FROM prices;
次の文は、表product_price_historyからproduct_idが3の行を削除します。
DELETE FROM product_price_history WHERE product_id = 3;
次のプロシージャは、product_idが2で、effective_to_dateがNULLの行をproduct_price_historyから削除します。
DECLARE currency product_price_history.currency_code%TYPE; BEGIN DELETE product_price_history WHERE product_id = 2 AND effective_to_date IS NULL returning currency_code INTO currency; dbms_output.Put_line(currency); END; USD
次の文は、currency_codeがEURの行を表product_price_historyから削除します。
DELETE (SELECT * FROM product_price_history) WHERE currency_code = 'EUR';
次の文は、副問合せを使用してproduct_price_historyから行を削除します。
DELETE product_price_history pp WHERE (product_id, currency_code, effective_from_date) IN (SELECT product_id, currency_code, Max(effective_from_date) FROM product_price_history GROUP BY product_id, currency_code);
次の文は、パーティションを使用してproduct_price_historyから行を削除します。
DELETE product_price_history partition (p1);
次の文は、表の情報を表示します。
SELECT * FROM product_price_history; PRODUCT_ID PRICE CUR EFFECTIVE EFFECTIVE ---------- ---------- --- --------- --------- 1 100 USD 01-JAN-15 02-JAN-15 1 60 GBP 01-JAN-15 02-JAN-15
次の文は、product_price_historyからすべての行を削除します。
DELETE product_price_history;