Oracle DBA基础教程
上QQ阅读APP看书,第一时间看更新

4.9 删除和截断表

在不需要一个表时,可以删除表,使用DROP TABLE语句,此时会彻底删除表中的数据和表的结构,表的结构指在创建表时定义的列名、列属性和一些约束信息。

如果只想删除表中的数据可以使用TRUNCATE TABLE语句截断一个表,此时会保留表的结构,只删除表中的数据。本节将讲解和演示如何删除和截断表。

为了演示如何删除或截断一个表,先使用例子4-28创建一个表EMP_TEMP。

例子4-28 创建一个表EMP_TEMP

    SQL> create TABLE scott.emp_temp
     2  as
     3  select *
     4  from scott.emp;
     
    表已创建。

不严谨地讲,表由表结构和表中的数据组成,如果不需要表中的数据,可以使用TRUNCATE来截断一个表。使用该指令截断表时,只删除表中的数据但是保留表的结构,也就是对表的定义还是存在的,可以使用INSERT指令向表中添加数据。

该指令的语法格式为:

    TRUNCATE TABLE username.TABLEname。

为了使读者便于直观理解,这里先给出一个例子(如例子4-29所示),然后再介绍TRUNCATE的其他特性。

例子4-29 截断表emp_temp

    SQL> truncate TABLE scott.emp_temp;
    
    表已截掉。

输出说明用户SCOTT中的表emp_temp已经截断,再使用例子4-30验证改变表的结构,也就是验证对表的定义是否还存在。

例子4-30 验证表emp_temp的定义是否还存在

    SQL> desc scott.emp_temp;
     名称                                                  是否为空? 类型
     ---------------------------------------------------------------------------------- ------------ -------------
     EMPNO                                                          NUMBER(4)
     ENAME                                                          VARCHAR2(10)
     JOB                                                             VARCHAR2(9)
     MGR                                                            NUMBER(4)
     HIREDATE                                                       DATE
     SAL                                                             NUMBER(7,2)
     COMM                                                           NUMBER(7,2)
     DEPTNO                                                         NUMBER(2)

显然,输出结果说明用户SCOTT的表emp_temp依然存在。再使用例子4-31来验证表中是否还有数据。

例子4-31 验证表emp_temp中是否还有数据

    SQL> select *
      2  from scott.emp_temp;
    
    未选定行

显然,用户SCOTT的表emp_temp中没有数据。

下面我们总结一下TRUNCATE指令的特性,这些特性来源于Oracle的文档。

● 删除表中的数据但是保留了表结构。

● 数据一旦删除就释放数据占有的磁盘空间,并且数据不可恢复。

● 如果表被外键引用,则无法使用TRUNCATE删除表中的数据。

● 所有和表相关的索引也被截断。

● 不会触发删除表的删除触发器。

在读者学习了索引和触发器后可以使用例子来验证上述对于TRUNCATE指令特性的说明是否正确。这里不再给出具体示例。

如果不再需要表,包括表中的数据和表的结构,则使用DROP指令。使用该指令时删除的是表的结构,表中的数据无法恢复,所以在使用该指令前务必要确认不再需要该表。使用DROP删除表的语法格式为:

    DROP TABLE [username.]TABLEname
    CASCADE CONSTRAINTS;

当一个表被DROP后,该表使用的EXTENTS得到释放,如果这些EXTENTS是连续分配的,则这些连续区域得到释放并组合成更大的可分配空间。如果该表的外键被另一个表引用,即该表在外键关系中是父表,则需要使用CASCADE CONSTRAINTS。使得该表脱离与子表的关系,并顺利删除。在维护数据完整性时会再次讲到CASCADE CONSTRAINTS,读者可以暂时不关心该参数的使用。

为了说明删除一个表,我们使用例子4-32来说明,在使用TRUNCATE删除用户SCOTT的表emp_temp时,正是删除了表中的数据,下面就使用DROP指令删除表结构。

例子4-32 使用DROP指令删除表emp_temp

    SQL> DROP TABLE scott.emp_temp;
    
    表已丢弃。

再使用例子4-33,验证该表的结构和表中数据是否存在。

例子4-33 验证SCOTT用户的表emp_temp结构是否存在

    SQL> desc scott.emp_temp;
    ERROR:
    ORA-04043: 对象 scott.emp_temp 不存在

显然在用户SCOTT的表emp_temp已经删除,因为错误提示为“对象 scott.emp_temp 不存在”。当然也无法查询该表中的数据。