18.1 DROP TABLE

目的

DROP TABLE文を使用すると、表またはオブジェクト表をごみ箱に移動したり、表およびそれに含まれるすべてのデータをデータベースから完全に削除することができます。

注意:

PURGE句を指定しないかぎり、DROP TABLEを実行しても、他のオブジェクトが使用できるように領域が解放されて表領域に戻されることはなく、その領域はユーザーの領域割当てとして計算されたままになります。

外部表の場合、この文はデータベースにある表のメタデータのみを削除します。データベースの外に常駐する実際のデータには影響を与えません。

クラスタの一部である表を削除すると、その表はごみ箱に移動します。ただし、その後にそのクラスタを削除すると、その表はごみ箱から消去され、FLASHBACK TABLE操作でもリカバリできなくなります。

表を削除すると、依存オブジェクトが無効になり、表のオブジェクト権限が取り消されます。表を再作成する際、表のオブジェクト権限を再度付与し、表の索引、整合性制約およびトリガーを再作成し、記憶域パラメータを再指定する必要があります。切捨ての場合は、このような影響はありません。そのため、TRUNCATE文による行の削除は、表を削除して再作成するよりも効率的です。

関連項目:

前提条件

削除する表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、DROP ANY TABLEシステム権限が必要です。

セッションがバインドされていない場合にのみ、一時表でDDL操作(ALTER TABLEDROP TABLECREATE INDEXなど)を実行できます。セッションを一時表にバインドするには、一時表でINSERT操作を実行します。セッションを一時表からアンバインドするには、TRUNCATE文を発行するか、セッションを終了します。また、トランザクション固有の一時表からアンバインドするには、COMMITまたはROLLBACK文を発行します。

構文

セマンティクス

schema

表が含まれているスキーマを指定します。schemaを指定しない場合、表は自分のスキーマ内にあるとみなされます。

table

削除する表の名前を指定します。Oracle Databaseによって次の操作が自動的に実行されます。

  • 表のすべての行が削除されます。

  • 表のすべての索引およびドメイン索引のみでなく、その表に定義されているすべてのトリガーが、作成者やスキーマの所有者とは関係なく削除されます。tableがパーティション化されている場合、対応するローカル索引パーティションも同様に削除されます。

  • tableのネストした表およびLOBのすべての記憶表が削除されます。

  • レンジ・パーティション表、ハッシュ・パーティション表またはリスト・パーティション表を削除すると、すべての表パーティションも削除されます。コンポジット・パーティション表を削除した場合、すべてのパーティションおよびサブパーティションが同様に削除されます。

  • PURGEキーワードでパーティション表を削除する場合、その文は一連のサブトランザクションとして実行され、それぞれのサブトランザクションで、パーティションまたはサブパーティションのサブセットおよびそのメタデータが削除されます。削除操作がこのように複数のサブトランザクションに分割されていることで、特に大きなパーティション表を削除する場合に、内部システム・リソース(ライブラリ・キャッシュなど)の消費処理が最適化されます。最初のサブトランザクションがコミットされるとすぐにUNUSABLEのマークが表に付けられます。いずれかのサブトランザクションが失敗した場合、その表に対して可能な操作は、もう一度DROP TABLE ... PURGE文を実行することのみです。この場合、前回のDROP TABLE文が失敗したところから、処理が継続されます。ただし、この処理は、前回の操作で発生したエラーが修正されていることを前提としています。

    このような削除操作でUNUSABLEのマークが付けられた表のリストは、該当する*_TABLES*_PART_TABLES*_ALL_TABLESまたは*_OBJECT_TABLESデータ・ディクショナリ・ビューのstatus列を問い合せて表示できます。

    関連項目:

    パーティション表の削除の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

  • 索引構成表の場合、索引構成表に定義したマッピング表も削除されます。

  • ドメイン索引の場合、適切な削除ルーチンが起動されます。これらのルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』 を参照してください。

  • 任意の統計タイプが表に関連付けられている場合、FORCE句によって統計タイプの関連付けが解除され、統計タイプを使用して収集されたユーザー定義のすべての統計情報が削除されます。

    関連項目:

    統計タイプの関連付けの詳細は、「ASSOCIATE STATISTICS」および「DISASSOCIATE STATISTICS」を参照してください。

  • 表がクラスタの一部でない場合、表とその索引に割り当てられていたすべてのデータ・ブロックが、表とその索引が格納されていた表領域に戻されます。

    DROP CLUSTER文にINCLUDING TABLES句を指定した場合、クラスタおよびそのすべての表を削除できます。これによって、表を1つずつ削除する必要がなくなります。「DROP CLUSTER」を参照してください。

  • 表がビュー、マテリアライズド・ビューのコンテナ表またはマスター表の実表である場合、あるいは表がストアド・プロシージャ、ファンクションまたはパッケージで参照されている場合、依存するオブジェクトは無効になりますが、削除はされません。表を再作成するか、これらのオブジェクトを一度削除してその表に依存しない形で再作成しないかぎり、これらのオブジェクトは使用できません。

    表を再作成する場合、ストアド・プロシージャ、ファンクションまたはパッケージで参照する列、およびマテリアライズド・ビューの定義で使用されていた副問合せで選択されるすべての列が、その表に含まれている必要があります。ビュー、ストアド・プロシージャ、ファンクション、パッケージに対するオブジェクト権限が付与されていたユーザーに、これらの権限を再付与する必要はありません。

    表がマテリアライズド・ビューのマスター表の場合、マテリアライズド・ビューの問合せはできます。ただし、そのマテリアライズド・ビューを定義する問合せによって選択されるすべての列を含む表を再作成しないかぎり、リフレッシュはできません。

    表がマテリアライズド・ビュー・ログを含む場合、このログおよびその表に関連付けられているダイレクト・パス・インサートのその他のリフレッシュ情報は削除されます。

表の削除の制限事項:

  • ネストした表の記憶表は直接削除できません。かわりに、ALTER TABLE ... DROP COLUMN句を使用して、ネストした表の列を削除する必要があります。

  • 参照パーティション表の親表は削除できません。まず、参照パーティション表のすべての子表を削除する必要があります。

  • 履歴追跡にフラッシュバック・データ・アーカイブを使用する表は削除できません。まず、表でのフラッシュバック・データ・アーカイブの使用を無効にする必要があります。

CASCADE CONSTRAINTS

CASCADE CONSTRAINTSを指定すると、削除される表の主キーまたは一意キーを参照するすべての参照整合性制約を削除できます。このような参照整合性制約があるときにこの句を省略した場合、エラーが戻され、表は削除されません。

PURGE

PURGEを指定すると、1つの手順で、表を削除してその表に関連付けられた領域を解放できます。PURGEを指定すると、表およびその依存オブジェクトはごみ箱に移動しません。

注意:

PURGE句を指定したDROP TABLE文はロールバックできません。また、PURGE句で削除した表はリカバリできません。

この句を使用することは、表を削除してからその表をごみ箱から消去することと同じです。この句を使用すると、それらの操作を1つの手順で実行できます。また、機密情報をごみ箱に表示しないようにできるため、セキュリティを強化できます。

関連項目:

ごみ箱の詳細、およびごみ箱内のオブジェクトのネーミング規則の詳細は、『Oracle Database管理者ガイド』を参照してください。

表の削除: 例

次の文は、oe.list_customers表(「リスト・パーティション化の例」で作成)を削除します。

DROP TABLE list_customers PURGE;