在Oracle中,Drop和Drop Purge之间的区别是什么?

27

我正在使用 Oracle 数据库,对于“Drop”和“Purge”命令有些困惑。实际上,对我来说两者都是在从数据库中删除带模式的表。这两者之间的主要区别是什么?

  1. Drop Table Tablename; (删除表)
  2. Drop Table Tablename Purge; (永久删除表,不可回滚)

5
这不是一个“看手册”的问题吗?而且它怎么可能既是MySQL又是Oracle呢? - MatBailie
“阅读手册”是大多数Stackoverflow上的Oracle问题的答案,可悲的是。 - David Aldridge
7个回答

48

通常情况下(从Oracle 10g开始),如果删除表,它将被移动到回收站中。但是,如果指定了“purge”修饰符,该表将从数据库中无法恢复地(完全)删除。


7
我认为需要补充一点,如果你不添加“清除(purge)”操作,表格将继续占用回收站的空间,因此如果你要进行清理,最好使用该操作。 - Ben
1
我同意Ben关于空间使用的观点,可以使用purge命令,或者我曾经看到过使用truncate table命令后跟着drop命令也能达到类似的效果。 - tbone

7

Oracle数据库10g引入了一个新特性,用于删除表。当你删除一个表时,数据库不会立即释放与该表关联的空间。相反,数据库会将表重命名并将其放置在回收站中,如果您发现意外删除了表,则可以使用FLASHBACK TABLE语句恢复它。 如果您想在发出DROP TABLE语句时立即释放与表相关联的空间,请包括PURGE子句,如下所示。 DROP TABLE employees PURGE; 仅当您希望在一步中删除表并释放与之相关联的空间时才指定PURGE。如果指定了PURGE,则数据库不会将表及其依赖对象放入回收站中。 注意:您无法使用PURGE子句回滚DROP TABLE语句,并且如果您使用PURGE子句删除表,则无法恢复该表。此功能在早期版本中不可用。


4

1
SQL>drop table table_name;

这个命令会删除名为table_name的表,但实际上它会被移动到Oracle回收站中(类似于在Windows操作系统上使用Delete键删除文件/文件夹)。
优点:
1. 如果需要,我们可以恢复上述已删除的表。
缺点:
1. 仍然占用一定量的内存。
SQL>drop table table_name purge;

这个命令会从数据库中完全删除表 table_name(类似于在 Windows 操作系统上使用 Shift + Delete 键删除任何文件/文件夹)。
利弊将会与上述相反。

1
以下语句将删除表并将其放入回收站。 以下语句将删除表并从回收站中清除。

为什么被投票否决了?一些评论会有所帮助吗?在我看来,它看起来是正确的。 - nanosoft

1

从@Randy的评论中可以清楚地看出,补充一下:

(1) Drop Table Tablename:

如果没有purge,表可能会在RECYCLEBIN或USER_RECYCLEBIN中,可以使用FLASHBACK命令进行恢复。这类似于我们在Windows桌面上删除的文件,它们会移动到回收站,可以被恢复。

(2) Drop Table Tablename Purge:

如果同时使用DropPurge,则其表空间将被释放,并且无法恢复。(就像在桌面上按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';

-1

删除表 table_name 并立即释放内存;

使用此查询会发生什么:通常情况下,如果删除表,则该表将移动到回收站中(从 Oracle 10g 开始)。但是,它仍然占用数据库中的内存,因此为了释放内存以供其他对象使用,我们可以使用 Purge 子句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接