当我们要删除一张表的时候,就需要使用到drop table命令。

一. 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 以删除引用已删除表中的主键和唯一键的所有引用完整性约束。如果省略此子句,并且存在此类引用的完整性约束,那么数据库将返回一个错误,而不会删除表。

二. 选项说明

1. schema

可选项,方案,这里可以理解为用户名, 缺省为当前用户下的表。
比如,要删除scott用户下的emp表,
drop table scott.emp

2.purge

可选项,如果开启了回收站(oracle 10g以后,回收站默认是开启的)功能,
不带purge选项,表示删除的表放进回收站,空间不回收 。使用flashbask可以闪回该表。
带purge选项,则表示将表删除,释放空间。
如果要在单个步骤中删除表并释放与其关联的空间,请指定purge。如果指定了purge,则数据库不会将表及其依赖对象放入回收站。

3.cascade constraints

可选项,如果有其它表关联到要删除的表的主键列或唯一键列(要删除的表是主表(父表),从表(子表)有外键关联到这张表),那么,直接用drop table会报错,这时候如果想要强制删除这张表,就需要加上cascade constraints选项

三. 实验

1.cascade constraints选项实验

SQL> drop table t;
drop table t
            *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> drop table t1;

Table dropped.

SQL> create table t(id number,name varchar2(20));

Table created.

SQL> create table t1(id number,sal number);

Table created.

SQL>
SQL> alter table t add constraint t_pk primary key(id);

Table altered.
--在T表上添加主键

SQL> alter table t1 add constraint t_fk foreign key(id) references t(id);

Table altered.
--在t1表上添加外键,关联到t表的主键列

SQL> insert into t values (1,'Smith');

1 row created.

SQL> insert into t values (2,'John');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> insert into t1 values(1,3000);

1 row created.

SQL> insert into t1 values(2,4000);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into t1 values(3,200);
insert into t1 values(3,200)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.T_FK) violated - parent key not found

SQL>
SQL> drop table t;
drop table t
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
-- 删除不成功

SQL> drop table t cascade constraints;

Table dropped.
--加上cascade constrants项,删除成功

SQL> select * from t1;



ID       SAL
---      ---


1       3000
2       4000


SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner='SOTT'and TABLE_NAME='T1';

no rows selected

SQL>

2.purge选项实验

--清空回收站
SQL> Purge recyclebin;

Recyclebin purged.

--建测试表
SQL> create table t(id int,name varchar2(10));

Table created.

--删除表不,加purge选项
SQL> drop table t;

Table dropped.

--删除的表已经放进回收站,只不过改了个表名
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---

T                BIN$Nl2YJRjLSyyJ45+XGN7pwA==$0 TABLE        2014-04-04:00:42:10

--闪回t表
SQL> flashback table t to before drop;

Flashback complete.

--t表已经回来了
SQL> select * from t;

no rows selected

--删除t表,加purge选项
SQL> drop table t purge;

Table dropped.

--没有放进回收站,回收站是空的
SQL> show recyclebin;
SQL>

注:不能回滚用purge子句删除的表,也不能恢复该表。

使用这个子句相当于首先删除表,然后从回收站清除它。这个子句在删除过程中省去了一个步骤。它还提供了增强的安全性,防止敏感材料出现在回收站。

最后修改:2021 年 11 月 01 日
如果觉得我的文章对你有用,请随意赞赏