有些情况下,当表的数据不再使用时,需要删除表的所有行,即清空该表。DM8 支持以下方式来删除表中的所有的行:
- 使用 DELETE 语句;
- 使用 DROP 和 CREATE 语句;
- 使用 TRUNCATE 语句。
1.1 使用 DELETE
使用 DELETE 语句能删除表中的行。
例 下面的语句删除 employee 表中的所有行
DELETE FROM employee;
复制
但是,使用 DELETE 清空表,当表有很多行时,会消耗很多系统资源。因为,DELETE 操作需要 CPU 时间,并且会产生大量的 REDO 日志和 UNDO 记录。另外,如果表上关联了元组级触发器,每删除一行,就会启动一次触发器。这都需要大量的系统资源。
1.2 使用 DROP 和 CREATE
使用 DROP 删除一个表,然后创建一个同名的表,也可以达到清空表的效果。
例 下面的语句先删除 employe 表,之后再重新创建。
DROP TABLE employee; CREATE TABLE employee(…);
复制
当删除和重新创建表时,所有与之相关联的索引、完整性约束和触发器也被删除。同样,所有针对被删除表的授权也会被删除。
1.3 使用 TRUNCATE
使用 TRUNCATE 语句能删除表中的所有行。
例 下面的语句清空 employee 表
TRUNCATE TABLE employee;
复制
TRUNCATE 语句为我们提供了一种快速、有效地删除表所有行的方法。并且 TRUNCATE 是一个 DDL 语句,不会产生任何回滚信息。执行 TRUNCATE 会立即提交,而且不能回滚。
TRUNCATE 语句并不影响与被删除的表相关联的任何结构、约束、触发器或者授权。另外,DM 数据库 TRUNCATE 表后,原来分配给该表的空间会被释放,供其他数据库对象使用,大大提高空间的利用效率。
一般情况下,普通用户只能 TRUNCATE 自己模式下的表。若要 TRUNCATE 其他模式下的表,则必须具有 DROP ANY TABLE 数据库权限。
如果要清空的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,并且子表不为空或子表的外键约束未被禁用,则不能 TRUNCATE 该表。