DROP TABLE
使用DROP TABLE語句將表或對象表移動到回收站或從數據庫中完全刪除表及其所有數據。
注:除非指定purge子句,否則drop table語句不會將表占用的空間釋放回表空間供其他對象使用,占用空間繼續計入用戶的空間配額。
對於外部表,此語句只刪除數據庫中的表元數據。它不會影響實際數據,實際數據位於數據庫之外。
刪除屬於群集的表時,該表將移動到回收站。但是,如果隨后除去集群,那么表將從回收站清空,不能再使用FLASHBACK TABLE進行恢復操作。
刪除表將使依賴對象失效,並刪除表上的對象特權。如果要重新創建表,則必須重新授予表的對象權限,重新創建表的索引、完整性約束和觸發器,並重新指定其存儲參數。TRUNCATE沒有這些效果。因此,使用truncate語句刪除行比刪除和重新創建表更有效。
先決條件
該表必須在您自己的模式中,或者您必須具有 DROP ANY TABLE系統權限。
只有在沒有會話綁定到臨時表時,才能對其執行DDL操作(如更改表、刪除表、創建索引)。通過對表執行插入操作,會話將綁定到臨時表。通過發出runcate語句或在會話終止時,或者對於事務特定的臨時表,通過發出commit或rollback語句,會話將解除與臨時表的綁定。
語義
模式
指定包含表的模式。如果省略了模式,那么Oracle數據庫假定表在您自己的模式中。
表
指定要刪除的表的名稱。Oracle數據庫自動執行以下操作:
- 刪除表中的所有行。
- 刪除所有表索引和域索引,以及表上定義的任何觸發器,無論是誰創建的索引或是誰的模式包含這些索引。如果是分區表,那么任何相應的本地索引分區也將刪除。
- 刪除嵌套表的所有存儲表和表的LOB。
- 刪除一個 range-, hash-, 或 list-分區表時,數據庫將刪除所有表分區。如果刪除一個復合分區表,那么所有分區和subpartitions也將被刪除。
- 當使用purge關鍵字刪除分區表時,該語句將作為一系列子事務執行,每個子事務都會刪除分區或子分區的子集及其元數據。這種將刪除操作分為子事務的划分優化了內部系統資源消耗的處理。(例如,庫緩存),尤其是用於刪除非常大的分區表。一旦第一個子事務提交,表就被標記為UNUSABLE。如果有subtransactions失敗,那么表上唯一允許的操作是另一個DROP TABLE ... PURGE語句。這樣的語句將從上一個drop table語句失敗的位置恢復工作,假定您已更正了上一個操作遇到的任何錯誤。您可以通過查詢數據字典視圖(視情況而定) *_TABLES, *_PART_TABLES, *_ALL_TABLES, 或*_OBJECT_TABLES的status列,列出此類刪除操作標記為UNUSABLE的表。
- 對於索引組織表,刪除索引組織表上定義的任何映射表。
- 對於域索引,調用適當的刪除例程。有關這些例程的詳細信息,請參閱《Oracle Database Data Cartridge Developer's Guide》。
- 如果有任何統計類型與表關聯,則數據庫將使用force子句取消統計類型的關聯,並刪除使用統計類型收集的任何用戶定義的統計。
- 如果表不是集群的一部分,那么數據庫會將分配給該表的所有數據塊及其索引返回到包含該表及其索引的表空間。要除去一個集群及其所有表,請將drop cluster語句與including tables子句一起使用,以避免單獨除去每個表。請參見DROP CLUSTER。
- 如果表是視圖、容器或物化視圖的主表的基表,或者如果它在存儲過程、函數或包中引用,則數據庫會使這些依賴對象失效,但不會刪除它們。你不能使用這些對象,除非您重新創建表或刪除並重新創建對象,以便它們不再依賴於表。如果選擇重新創建表,則它必須包含最初用於定義物化視圖的子查詢所選的所有列以及存儲過程、函數或包中引用的所有列。以前授予視圖、存儲過程、函數或包不需要重新授予這些特權。如果該表是物化視圖的主表,則仍然可以查詢物化視圖,但除非重新創建該表,以便包含物化視圖定義查詢所選的所有列,否則無法刷新該表。如果表具有物化視圖日志,那么數據庫將刪除此日志以及與該表關聯的任何其他直接路徑 INSERT 刷新信息。
刪除表的限制
- 不能直接刪除嵌套表的存儲表。相反,必須使用 ALTER TABLE ... DROP COLUMN子句刪除嵌套表列。
- 不能刪除引用分區表的父表。必須首先刪除所有引用分區子表。
- 不能刪除使用回閃數據存檔進行歷史跟蹤的表。必須首先禁用該表使用回閃數據存檔。
級聯約束
指定 CASCADE CONSTRAINTS 以刪除引用已刪除表中的主鍵和唯一鍵的所有引用完整性約束。如果省略此子句,並且存在此類引用的完整性約束,那么數據庫將返回一個錯誤,而不會刪除表。
PURGE
如果要在單個步驟中刪除表並釋放與其關聯的空間,請指定purge。如果指定了purge,則數據庫不會將表及其依賴對象放入回收站。
注:不能回滾用purge子句刪除的表,也不能恢復該表。
使用這個子句相當於首先刪除表,然后從回收站清除它。這個子句在刪除過程中省去了一個步驟。它還提供了增強的安全性,防止敏感材料出現在回收站。