1.前言


对数据库来说,最重要的是里面的数据,数据安全是数据库中的重中之重。任何涉及有关数据的操作都应谨慎,尤其是涉及删除,清空表的操作,下面博主介绍下关于删除表和清空表的语法,谨慎操作。


2.删除表


当一个表不再使用时,可以将其删除。删除表时,将产生以下结果:

  1. 表的结构信息从数据字典中删除,表中的数据不可访问;
  2. 表上的所有索引和触发器被一起清除;
  3. 所有建立在该表上的同义词、视图和存储过程变为无效;
  4. 所有分配给表的簇标记为空闲,可被分配给其他的数据库对象。
    一般情况下,普通用户只能删除自己模式下的表。若要删除其他模式下的表,则必须具有 DROP ANY TABLE 数据库权限。
    以下语句可删除 employee 表:
DROP TABLE employee;

删除不存在的表会报错。若指定 IF EXISTS 关键字,删除不存在的表,不会报错,如:

DROP TABLE IF EXISTS employee;

如果要删除的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,则需要在 DROP TABLE 语句中包含 CASCADE 选项,如:

DROP TABLE employee CASCADE;


3.清空表


有些情况下,当表的数据不再使用时,需要删除表的所有行,即清空该表。DM8 支持以下方式来删除表中的所有的行:

  1. 使用 DELETE 语句;
  2. 使用 DROP 和 CREATE 语句;
  3. 使用 TRUNCATE 语句。


3.1 使用delete


使用 DELETE 语句能删除表中的行。例如,下面的语句删除 employee 表中的所有行:

DELETE FROM employee;

但是,使用 DELETE 清空表,当表有很多行时,会消耗很多系统资源。因为,DELETE操作需要 CPU 时间,并且会产生大量的 REDO 日志和 UNDO 记录。另外,如果表上关联了元 组级触发器,每删除一行,就会启动一次触发器。这都需要大量的系统资源。


3.2 使用 DROP 和 CREATE


使用 DROP 删除一个表,然后创建一个同名的表,也可以达到清空表的效果。例如,下面的语句先删除 employe 表,之后再重新创建。

DROP TABLE EMPLOYEE;
CREATE TABLE EMPLOYEE(…);

当删除和重新创建表时,所有与之相关联的索引、完整性约束和触发器也被删除。同样,所有针对被删除表的授权也会被删除。


3.3 使用 TRUNCATE


使用 TRUNCATE 语句能删除表中的所有行。例如,下面的语句清空 employee 表。

TRUNCATE TABLE EMPLOYEE;

TRUNCATE 语句为我们提供了一种快速、有效地删除表所有行的方法。并且 TRUNCATE 是一个 DDL 语句,不会产生任何回滚信息。执行 TRUNCATE 会立即提交,而且不能回滚。
TRUNCATE 语句并不影响与被删除的表相关联的任何结构、约束、触发器或者授权。 另外,DM 数据库 TRUNCATE 表后,原来分配给该表的空间会被释放,供其他数据库对象使用,大大提高空间的利用效率。
一般情况下,普通用户只能 TRUNCATE 自己模式下的表。若要 TRUNCATE 其他模式下的表,则必须具有 DROP ANY TABLE 数据库权限。
如果要清空的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,并且子表不为空或子表的外键约束未被禁用,则不能 TRUNCATE 该表。


总结


1、在速度上,一般来说,drop> truncate > delete。

2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;

如果想删除表,当然用drop;

如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;

如果和事务有关,或者想触发trigger,还是用delete;

如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。