一、临时表
当处理复杂的查询或事务时,由于在数据写入永久表之前需要暂时存储一些行信息或需要保存查询的中间结果,可能需要一些表来临时存储这些数据。DM 允许创建临时表来保存会话甚至事务中的数据。在会话或事务结束时,这些表上的数据将会被自动清除。
临时表中的数据不能像在其它永久表中的数据那样进行备份,当事务结束或会话断开时,数据就会被清空。在临时表创建过程中,不会像永久表和索引那样自动分配数据段,而是仅当第一次执行 DML 语句时,才会为临时表在临时表空间中分配空间。并且,对于不同的会话,临时表上的数据是独享的,不会互相干扰,即会话 A 不能访问会话 B 临时表上的数据。
二、视图
视图是从一个或几个基表(或视图)导出的表,但它是一个虚表,即数据字典中只存放视图的定义(由视图名和查询语句组成),而不存放对应的数据,这些数据仍存放在原来的基表中。
创建视图后,当你表里的数据增加或者删除的时候,你视图里的内容也随之变化。
三、临时表与视图使用
1.首先创建一张表并插入数据
create TABLE EMP (
id INT PRIMARY KEY,
name VARCHAR(15),
JOB VARCHAR(10),
sex VARCHAR CHECK('男' OR '女'),
age INT
);
insert into TEST.EMP VALUES(101,'小兰','老师','女',21);
insert into TEST.EMP VALUES(102,'小美','医生','女',23);
insert into TEST.EMP VALUES(103,'小绿','老师','男',22);
insert into TEST.EMP VALUES(104,'小紫','工程师','女',21);
insert into TEST.EMP VALUES(105,'小红','护士','女',21);
insert into TEST.EMP VALUES(106,'小黄','工人','男',25);
insert into TEST.EMP VALUES(107,'小橙','工程师','男',21);
insert into TEST.EMP VALUES(108,'小青','护士','女',20);
insert into TEST.EMP VALUES(109,'小明','老师','男',23);
insert into TEST.EMP VALUES(110,'小白','医生','男',25);
2.临时表
(1)创建事务级临时表并查找
CREATE GLOBAL TEMPORARY TABLE TMP_EMP(
id INT PRIMARY KEY,
name VARCHAR(15),
JOB VARCHAR(10))
ON COMMIT DELETE ROWS;
可见,我们创建的临时表与源表并无直接的关系。
(2)在临时表中插入数据
再次查询临时表,可以看到我们插入的数据
(3)修改临时表,查看源表是否修改
我们看到,临时表修改的数据,源表并没有修改。
(4)提交事务后,再次查看临时表
提交事务后,临时表内数据就不存在了。
3.视图
(1)创建视图并使用
create VIEW V_EMP AS SELECT id,name,job from TEST.EMP;
(2)修改视图内容,查看源表是否修改
我们可以看到,修改了视图里的内容,源表也会跟着修改,所以使用视图最好只使用查找操作。
(3)提交事务后,再次查看视图
提交事务后,视图依旧存在。
四、临时表与视图的使用场景
1.什么时候使用视图呢?
应用场景1:保密工作,如果表中有客户隐私数据,姓名、地址、邮箱、电话号码、工资等隐私数据,把数据敏感字段过滤掉就可以呈现的你想呈现数据了。
应用场景2:有一个查询语句非常复杂,有时还想把这个非常复杂的select语句和其他表关联起来得到结果,可以用一个视图来代替这个复杂的select语句,使视图充当一个变量角色。
2.什么时候用临时表呢?
应用场景1:在一个大型的事务中(如购物等),你在短期内有很多DML操作,但当这个大型事务提交后,这些数据就要清掉,这时需要用临时表。
应用场景2:在导出数据时,你可能只想要导出符合某些条件的数据,那么你可以创建临时表,把select语句插入到临时表,接着导出这个临时表,导完以后通过结束session或者事务的方式,让这些没用的数据自动清理掉。
应用场景3:你在写存储过程时,有很多的连接,比如你需要连接很多张表,才能得到你的结果表,同时做连接的消耗太大,你可以先把几张表连接的结果,放在临时表,接着再把这张临时表,跟其他的表连接,最后得到临时表数据,一次插入到结果表(永久表)。
想了解更多达梦数据库相关信息,欢迎访问达梦技术社区:首页 | 达梦云设配中心(dameng.com)