欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

达梦数据库:删除表和清空表

程序员文章站 2022-03-15 15:23:32
...

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,再重新导入/插入数据。

更多资讯请上达梦技术社区了解: https://eco.dameng.com