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

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

用test用户登录,我们可以查询sysdba.t1表的数据,但是却查询不了test.t2表的数据,因为我们没有赋给test用户,test.t2的查询权限,那怕t2表是test用户下的表。我们给test用户配置相应的表的权限,比如我们只给test用户查看sysdba.t1的权限:SQL>Grant select on sysdba.t1 to test;再以test用户登录进行查询,发现test.t2表的访问权限已经没有了,sysdba.t1表的访问权限也已经没有了。我们再查询一下test用户的访问权限。 我们在数据库运维环境中有时会出现需删除表中重复数据的情况,比如说,导入时重复导入了,这时候我们怎么办?如何删除重复的数据,保证数据的正确性和完整性? 操作系统:中标麒麟6.0 数据库系统:DM8 我们先来创建一张测试表test SQL>create table test(id int,name varchar(50)); 手动在表test中添加重复记录 insert into test values(1,'aaa'); insert into test values(1,'aaa'); 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言准备一、通过参数进行清理1 ARCH_SPACE_LIMIT2 ARCH_RESERVE_TIME二、通过系统存储过程和函数进行清理1 SF_ARCHIVELOG_DELETE_BEFORE_TIME2 SF_ARCHIVELOG_DELETE_BEFORE_LSN三、DM自 是因为每张表的结构不一样,不是每张表的注释字段都是 comments,你需要先查出自己表的注释字段是什么,然后再放进去第二个sql进行查询。同理可得,是不是我们也可以用这个查字段之类的,其他值。为什么分开类似的数据我要查询两次呢? select * from dba_free_space; 表空间创建 create tablespace TEST datafile 'C:\dmdbms\data\DAMENG\TEST.DBF' size 128 autoextend on next 4 maxsize 10240; 增加数据文件: alter tablespace TEST add datafile 'C:\dmdbms\da 达梦用户表空间的基本操作 1、创建一个用户表空间 create tablespace TBS datafile ‘/opt/dm8/data/DAMENG/TBS01.dbf’ size 128 autoextend on next 4 maxsize 10240,’/opt/dm8/data/DAMENG/TBS02.dbf’ size 128 autoextend on next 4 maxsize 10240; 这个语句创建了一个TBS的表空间,初始化两个文件TBS01.dbf和TBS02.dbf