创建临时表

临时表在需要缓存(临时持久化)结果集的应用中十分有用,可能因为临时表是通过多个DML操作构造的。例如,考虑以下场景:
基于Web的航空公司预订应用程序允许用户创建几个可选行程。每个行程用临时表的一行来表示。应用程序通过更新行来反映行程的变化。当客户决定她想要使用哪个行程时,应用将会把表示选定行程的一行数据迁移到一个持久表。

在会话期间,行程数据是私有的。在会话结束时,可选行程都将被删除。

 

临时表的定义对所有会话都是可见的,但是临时表中的数据,只有在进行插入操作的会话中可见。
使用CREATE GLOBAL TEMPORARY TABLE语句来创建临时表,其中,ON COMMIT子句表示临时表数据的保存策略,包括事务专用(默认)和会话专用两种,具体影响参考下表:

ON COMMIT设置

含义

DELETE ROWS

这将创建一个临时表,是事务专用型的。在一个事务中,当第一次向临时表执行插入操作时,该会话与临时表建立关系。在事务结束时,这种关系将会结束。数据库会在每次提交后截断表(删除所有数据)。

PRESERVE ROWS

这将创建一个临时表,是会话专用型的。在一个会话中,当第一次向临时表执行插入操作时,该会话与临时表建立关系。在会话结束或者执行TRUNCATE操作时,这种关系将会结束。当你结束会话时,数据库会截断表(删除所有数据)。

 

下面语句创建了一个事务专用临时表:

点击(此处)折叠或打开

  1. CREATE GLOBAL TEMPORARY TABLE admin_work_area
  2.         (startdate DATE,
  3.          enddate DATE,
  4.          class CHAR(20))
  5.       ON COMMIT DELETE ROWS;


在临时表上可以创建索引,它们也是临时的,索引中的数据和临时表的数据具有相同的会话或者事务范围。

 

默认情况下,临时表中的数据存储在用户创建的默认临时表空间。但是,在创建临时表时,你可以通过使用TABLESPACE子句把数据存储到另外一个表空间。你可以使用这个特性来节省临时表空间。例如,如果你必须执行很多小的临时表操作,而默认临时表空间被用来执行排序操作使用了大的分区,这时,这些小的临时表操作将会占用大量不必要的磁盘空间。这种情况下,最好是分配一个较小分区的第二临时表空间。

 

下面的两个语句创建了一个分区大小为64K的临时表空间,然后在该表空间上创建一个临时表。

 

点击(此处)折叠或打开

  1. CREATE TEMPORARY TABLESPACE tbs_t1
  2.     TEMPFILE \'tbs_t1.f\' SIZE 50m REUSE AUTOEXTEND ON
  3.     MAXSIZE UNLIMITED
  4.     EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;

  5. CREATE GLOBAL TEMPORARY TABLE admin_work_area
  6.         (startdate DATE,
  7.          enddate DATE,
  8.          class CHAR(20))
  9.       ON COMMIT DELETE ROWS
  10.       TABLESPACE tbs_t1;


与永久表不同的是,临时表及其索引在被创建时不会自动分配段,而是在第一次执行INSERT (或 CREATE TABLE AS SELECT)操作时才会分配段。因此,如果在第一次执行INSERT操作前去执行SELECT, UPDATE, 或者 DELETE操作,表显示为空。

 

只有在临时表没有和任何会话建立关系时,我们才能对该临时表执行DDL操作(除了TRUNCATE)。

 

如果你回滚事务,你输入的数据将会丢失,尽管表的定义仍然存在。

 

事务专用临时表一次只允许一个事务,如果在一个事务范围内存在多个自治事务,每个自治事务只能在上一自治事务提交后才能使用该临时表。

 

根据临时表的定义,表中的数据是临时的,因此,在系统故障时是不提供临时表数据的备份与恢复功能的。为了保护临时表数据,你应该制定其他替代方法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-1627626/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30162081/viewspace-1627626/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值