对数据库来说,最重要的是里面的数据,数据安全是数据库中的重中之重。任何涉及有关数据的操作都应谨慎,尤其是涉及删除,清空表的操作,下面博主介绍下关于删除表和清空表的语法,谨慎操作。
2.删除表
当一个表不再使用时,可以将其删除。删除表时,将产生以下结果:
-
表的结构信息从数据字典中删除,表中的数据不可访问;
-
表上的所有索引和触发器被一起清除;
-
所有建立在该表上的同义词、视图和存储过程变为无效;
-
所有分配给表的簇标记为空闲,可被分配给其他的数据库对象。
一般情况下,普通用户只能删除自己模式下的表。若要删除其他模式下的表,则必须具有 DROP ANY TABLE 数据库权限。
以下语句可删除 employee 表:
DROP TABLE employee;
删除不存在的表会报错。若指定 IF EXISTS 关键字,删除不存在的表,不会报错,如:
DROP TABLE IF EXISTS employee;
如果要删除的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,则需要在 DROP TABLE 语句中包含 CASCADE 选项,如:
DROP TABLE employee CASCADE;
3.清空表
有些情况下,当表的数据不再使用时,需要删除表的所有行,即清空该表。DM8 支持以下方式来删除表中的所有的行:
- 使用 DELETE 语句;
- 使用 DROP 和 CREATE 语句;
- 使用 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