我正在使用 Oracle 数据库,对于“Drop”和“Purge”命令有些困惑。实际上,对我来说两者都是在从数据库中删除带模式的表。这两者之间的主要区别是什么?
- Drop Table Tablename; (删除表)
- Drop Table Tablename Purge; (永久删除表,不可回滚)
我正在使用 Oracle 数据库,对于“Drop”和“Purge”命令有些困惑。实际上,对我来说两者都是在从数据库中删除带模式的表。这两者之间的主要区别是什么?
通常情况下(从Oracle 10g开始),如果删除表,它将被移动到回收站中。但是,如果指定了“purge”修饰符,该表将从数据库中无法恢复地(完全)删除。
Oracle数据库10g引入了一个新特性,用于删除表。当你删除一个表时,数据库不会立即释放与该表关联的空间。相反,数据库会将表重命名并将其放置在回收站中,如果您发现意外删除了表,则可以使用FLASHBACK TABLE语句恢复它。 如果您想在发出DROP TABLE语句时立即释放与表相关联的空间,请包括PURGE子句,如下所示。 DROP TABLE employees PURGE; 仅当您希望在一步中删除表并释放与之相关联的空间时才指定PURGE。如果指定了PURGE,则数据库不会将表及其依赖对象放入回收站中。 注意:您无法使用PURGE子句回滚DROP TABLE语句,并且如果您使用PURGE子句删除表,则无法恢复该表。此功能在早期版本中不可用。
一个指向asktom文章的链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32543538041420
基本上,使用oracle10,所有删除的表都会进入回收站,可以从回收站中找回。使用purge命令,您可以跳过回收站部分,直接删除表,没有撤销操作的选项。
SQL>drop table table_name;
SQL>drop table table_name purge;
从@Randy的评论中可以清楚地看出,补充一下:
(1) Drop Table Tablename:
如果没有purge
,表可能会在RECYCLEBIN或USER_RECYCLEBIN中,可以使用FLASHBACK
命令进行恢复。这类似于我们在Windows桌面上删除的文件,它们会移动到回收站,可以被恢复。
(2) Drop Table Tablename Purge:
如果同时使用Drop
和Purge
,则其表空间将被释放,并且无法恢复。(就像在桌面上按Shift+Delete)
以下示例给出了实际示例:
create table test_client (val_cli integer, status varchar2(10));
drop table test_client ;
select tablespace_name from all_tables where owner = 'test' and table_name = 'TEST_CLIENT';
SELECT * FROM RECYCLEBIN where ORIGINAL_NAME='TEST_CLIENT';
SELECT * FROM USER_RECYCLEBIN where ORIGINAL_NAME='TEST_CLIENT';
FLASHBACK TABLE test_client TO BEFORE DROP;
select tablespace_name from all_tables where owner = 'test' and table_name = 'TEST_CLIENT';
drop table test_client purge;
select tablespace_name from all_tables where owner = 'test' and table_name = 'TEST_CLIENT';
删除表 table_name 并立即释放内存;
使用此查询会发生什么:通常情况下,如果删除表,则该表将移动到回收站中(从 Oracle 10g 开始)。但是,它仍然占用数据库中的内存,因此为了释放内存以供其他对象使用,我们可以使用 Purge 子句。