###2.2 删除表

删除一个表将会删除:

  • 数据
  • 表结构
  • 数据库触发器
  • 相应的索引
  • 关联的对象权限


DROP TABLE 语句的可选子句:

  • CASCADE CONSTRAINTS:相关的引用完整性约束条件
  • PURGE:无法闪回


DROP TABLE 的一些考虑事项:

  • 如果不使用PURGE子句,则表定义、关联索引和触发器会被放置在回收站中。表数据仍存在,但如不使用修改后的表名称就无法访问(将表放在RECYCLEBIN 时表名称发生了更改)。如果使用Enterprise Manager 删除了表,则不需要使用PURGE 子句。
  • 使用FLASHBACK TABLE 命令可从回收站恢复方案对象。PURGE RECYCLEBIN 命令可清空回收站。
  • 需要使用CASCADE CONSTRAINTS 选项才能删除所有相关的引用完整性约束条件。

注: 如果不使用PURGE选项,那么表及表索引所占用的空间仍会计入用户的表空间可用限额中。也就是说,这些空间仍被视为已占用。但是,如果用户已经达到了其限额,则系统会自动从回收站对象中回收空间。

######################删除表######################
SQL> create table emp2 as select * from emp1;

Table created.

SQL> desc emp2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMP1_ID                                            NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBE                                        VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)
 SCORE                                              NUMBER(3)

SQL> select constraint_name, constraint_type from user_constraints where table_name = 'EMP2';

CONSTRAINT_NAME                C
------------------------------ -
SYS_C0044626                   C
SYS_C0044627                   C
SYS_C0044628                   C
SYS_C0044629                   C

SQL> drop table emp2;

Table dropped.

###查看闪回区
SQL> desc USER_RECYCLEBIN;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 ORIGINAL_NAME                                      VARCHAR2(32)
 OPERATION                                          VARCHAR2(9)
 TYPE                                               VARCHAR2(25)
 TS_NAME                                            VARCHAR2(30)
 CREATETIME                                         VARCHAR2(19)
 DROPTIME                                           VARCHAR2(19)
 DROPSCN                                            NUMBER
 PARTITION_NAME                                     VARCHAR2(32)
 CAN_UNDROP                                         VARCHAR2(3)
 CAN_PURGE                                          VARCHAR2(3)
 RELATED                                   NOT NULL NUMBER
 BASE_OBJECT                               NOT NULL NUMBER
 PURGE_OBJECT                              NOT NULL NUMBER
 SPACE                                              NUMBER

SQL> select OBJECT_NAME, ORIGINAL_NAME, TYPE from USER_RECYCLEBIN;

OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$Gccf4DgLkOfgUOAKyMMgAQ==$0 EMP2                             TABLE
BIN$GSvDnQHLJFDgUOAKyMNIWg==$0 TEST01                           TABLE
BIN$GSusjACgDczgUOAKyMNG9Q==$0 TEST03                           TABLE
BIN$GSm4+ZP7c1fgUOAKyMNDdQ==$0 TEST_01                          TABLE
BIN$FyE8rj5stLDgUOAKyMMgiQ==$0 EMP1                             TABLE
BIN$FyE8rj5ntLDgUOAKyMMgiQ==$0 EMPL                             TABLE
BIN$FyE8rj5itLDgUOAKyMMgiQ==$0 EMP1                             TABLE
BIN$FxuyiLIm053gUOAKyMMSgw==$0 EMP1                             TABLE
BIN$/ktf0vegBxjgQOAKyMNg6A==$0 LOCATIONS_DEMO                   TABLE
BIN$/ktf0vefBxjgQOAKyMNg6A==$0 LOC_ID_PK1                       INDEX
BIN$/C1n/wm/Y0jgQOAKyMMSaQ==$0 MY_TALBE                         TABLE

###恢复删掉的表
SQL> flashback table emp2 to before drop;

Flashback complete.

SQL> select constraint_name, constraint_type from user_constraints where table_name = 'EMP2';

CONSTRAINT_NAME                C
------------------------------ -
BIN$Gccf4DgHkOfgUOAKyMMgAQ==$0 C
BIN$Gccf4DgIkOfgUOAKyMMgAQ==$0 C
BIN$Gccf4DgJkOfgUOAKyMMgAQ==$0 C
BIN$Gccf4DgKkOfgUOAKyMMgAQ==$0 C

SQL> select count(*) from emp2;

  COUNT(*)
----------
         1

####################删除表带有purge####################
SQL> drop table emp2 purge;

Table dropped.

SQL> select OBJECT_NAME, ORIGINAL_NAME, TYPE from USER_RECYCLEBIN where ORIGINAL_NAME = 'EMP2';

no rows selected

####################删除表带有cascade constraints####################
create table dep3
(dep1_id number(2) constraint dep1_id_pk primary key,
 dep1_name varchar(10));

insert into dep3 values(1, 'dev');
insert into dep3 values(2, 'qa');

commit; 

create table emp3
(emp3_id number(3) constraint emp3_id_pk primary key,
 emp3_name varchar(10),
 dep_id number(2) constraint sele references dep3(dep1_id)
);

insert into emp3 values(001, 'dev1', 1 );
insert into emp3 values(002, 'qa1', 2);

commit;

SQL> select * from emp3;

   EMP3_ID EMP3_NAME      DEP_ID
---------- ---------- ----------
         1 dev1                1
         2 qa1                 2

SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where table_name = 'EMP3';

CONSTRAINT_NAME                C
------------------------------ -
EMP3_ID_PK                     P
DEP_ID_FK                      R
		 

SQL> drop table dep3;
drop table dep3
           *
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys

SQL> alter table emp3
  2  disable novalidate constraint dep_id_fk;

Table altered.

SQL> drop table dep3;
drop table dep3
           *
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys

#需要使用CASCADE CONSTRAINTS 选项才能删除所有相关的引用完整性约束条件。
SQL> drop table dep3 cascade constraints;

Table dropped.

SQL> select * from emp3;

   EMP3_ID EMP3_NAME      DEP_ID
---------- ---------- ----------
         1 dev1                1
         2 qa1                 2

SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where table_name = 'EMP3';

CONSTRAINT_NAME                C
------------------------------ -
EMP3_ID_PK                     P


#添加外键约束
SQL> alter table emp3
  2  add constraint emp3_id_fk foreign key (dep_id) references dep3(dep1_id);

Table altered.

SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where table_name = 'EMP3';

CONSTRAINT_NAME                C
------------------------------ -
EMP3_ID_PK                     P
EMP3_ID_FK                     R

截断表

  • 截断表时会删除数据并释放已用空间。
  • 会截断相应的索引。
  • 通过将高水位标记(HWM)设置到表开头,将表标记为空,从而使表行不可用。
  • 由于TRUNCATE TABLE 是DDL 命令,因此不会生成还原数据,而且会隐式提交命令。
  • 不会截断外键引用的表。
  • 使用此命令时不会触发删除触发器。

注: 要删除所有表行,这种方式通常比发出DELETE 语句的速度要快很多倍,原因如下:

  • Oracle DB 重置表的HWM,而不是象DELETE 一样处理每行。
  • 不生成还原数据。
####Truncate表
SQL> truncate table dep3 ;
truncate table dep3
               *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

#根据表来查看引用外键的表
SELECT uc.constraint_name,
       uc.constraint_type,
       uc.table_name,
       uc.r_constraint_name
  FROM user_constraints uc, user_cons_columns ucc
 WHERE UC.R_CONSTRAINT_NAME = UCC.CONSTRAINT_NAME AND UCC.TABLE_NAME = 'DEP3';

CONSTRAINT_NAME      C TABLE_NAME      R_CONSTRAINT_NAME
-------------------- - --------------- --------------------
EMP3_ID_FK           R EMP3            DEP1_ID_PK

#禁用掉外键
SQL> alter table emp3
  2  disable novalidate constraint emp3_id_fk;

Table altered.

SQL> truncate table emp3;

Table truncated.