临时表在需要缓存(临时持久化)结果集的应用中十分有用,可能因为临时表是通过多个DML操作构造的。例如,考虑以下场景:
基于Web的航空公司预订应用程序允许用户创建几个可选行程。每个行程用临时表的一行来表示。应用程序通过更新行来反映行程的变化。当客户决定她想要使用哪个行程时,应用将会把表示选定行程的一行数据迁移到一个持久表。
在会话期间,行程数据是私有的。在会话结束时,可选行程都将被删除。
临时表的定义对所有会话都是可见的,但是临时表中的数据,只有在进行插入操作的会话中可见。
使用CREATE GLOBAL TEMPORARY TABLE语句来创建临时表,其中,ON COMMIT子句表示临时表数据的保存策略,包括事务专用(默认)和会话专用两种,具体影响参考下表:
ON COMMIT设置 |
含义 |
DELETE ROWS |
这将创建一个临时表,是事务专用型的。在一个事务中,当第一次向临时表执行插入操作时,该会话与临时表建立关系。在事务结束时,这种关系将会结束。数据库会在每次提交后截断表(删除所有数据)。 |
PRESERVE ROWS |
这将创建一个临时表,是会话专用型的。在一个会话中,当第一次向临时表执行插入操作时,该会话与临时表建立关系。在会话结束或者执行TRUNCATE操作时,这种关系将会结束。当你结束会话时,数据库会截断表(删除所有数据)。 |
下面语句创建了一个事务专用临时表:
点击(此处)折叠或打开
-
CREATE GLOBAL TEMPORARY TABLE admin_work_area
-
(startdate DATE,
-
enddate DATE,
-
class CHAR(20))
- ON COMMIT DELETE ROWS;
在临时表上可以创建索引,它们也是临时的,索引中的数据和临时表的数据具有相同的会话或者事务范围。
默认情况下,临时表中的数据存储在用户创建的默认临时表空间。但是,在创建临时表时,你可以通过使用TABLESPACE子句把数据存储到另外一个表空间。你可以使用这个特性来节省临时表空间。例如,如果你必须执行很多小的临时表操作,而默认临时表空间被用来执行排序操作使用了大的分区,这时,这些小的临时表操作将会占用大量不必要的磁盘空间。这种情况下,最好是分配一个较小分区的第二临时表空间。
下面的两个语句创建了一个分区大小为64K的临时表空间,然后在该表空间上创建一个临时表。
点击(此处)折叠或打开
-
CREATE TEMPORARY TABLESPACE tbs_t1
-
TEMPFILE \'tbs_t1.f\' SIZE 50m REUSE AUTOEXTEND ON
-
MAXSIZE UNLIMITED
-
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;
-
-
CREATE GLOBAL TEMPORARY TABLE admin_work_area
-
(startdate DATE,
-
enddate DATE,
-
class CHAR(20))
-
ON COMMIT DELETE ROWS
- TABLESPACE tbs_t1;
与永久表不同的是,临时表及其索引在被创建时不会自动分配段,而是在第一次执行INSERT (或 CREATE TABLE AS SELECT)操作时才会分配段。因此,如果在第一次执行INSERT操作前去执行SELECT, UPDATE, 或者 DELETE操作,表显示为空。
只有在临时表没有和任何会话建立关系时,我们才能对该临时表执行DDL操作(除了TRUNCATE)。
如果你回滚事务,你输入的数据将会丢失,尽管表的定义仍然存在。
事务专用临时表一次只允许一个事务,如果在一个事务范围内存在多个自治事务,每个自治事务只能在上一自治事务提交后才能使用该临时表。
根据临时表的定义,表中的数据是临时的,因此,在系统故障时是不提供临时表数据的备份与恢复功能的。为了保护临时表数据,你应该制定其他替代方法。