全局临时表
说明
在数据库中临时表在需要缓存(临时保留)结果集的应用程序中很有用,临时表保存仅在事务或会话期间存在的数据。全局临时表是临时表中的一种类型,它是存储在磁盘上的永久数据库对象,全局临时表的元数据对多个用户及其会话可见,但其内容对会话而言是本地的。
使用 CREATE GLOBAL TEMPORARY TABLE 语句创建全局临时表,ON COMMIT子句指示表中的数据是特定于事务(默认)还是特定于会话,其含义如下:
| ON COMMIT 选项 | 描述 |
|---|---|
| DELETE ROWS | 这创建了一个全局性的临时表,是针对事务的。当事务第一次插入全局临时表时,会话就被绑定到该表。绑定在事务结束后就消失了。数据库在每次提交后都会截断该表(删除所有行) |
| PRESERVE ROWS | 这将创建一个全局临时表,该表是针对会话的。在会话中第一次插入表时,会话会被绑定到全局临时表上。这种绑定在会话结束时或在会话中对表发出TRUNCATE时消失。当你终止会话时,数据库会截断该表 |
第一次创建临时表时,它的元数据存储在数据字典中,但没有为表数据分配空间。在对表执行第一个 DML 操作时为表段分配空间。临时表定义以与常规表定义相同的方式持久存在,但表段和表包含的任何数据都是特定于会话或特定于事务的数据。可以使用 ON COMMIT 子句指定表段和数据是会话特定的还是事务特定的。
通过对表执行 INSERT 操作,会话将绑定到临时表。使用 TRUNCATE 语句或在会话终止时,或者对于特定于事务的临时表,通过发出 COMMIT 或 ROLLBACK 语句,会话将解除绑定到临时表。
示例
--会话临时表示例
--session1
highgo=# create global temporary table tmp (d number) on commit preserve rows;
CREATE TABLE
highgo=# insert into tmp values (1);
INSERT 0 1
highgo=# select * from tmp;
d
-–
1
(1 row)
highgo=# select * from tmp;
d
-–
1
(1 row)
highgo=#
--session2
highgo=# insert into tmp values (100);
INSERT 0 1
highgo=# select * from tmp;
d
-—-
100
(1 row)
--事务临时表
--当事务提交后,数据不保留
highgo=# create GLOBAL TEMPORARY table foo2(
highgo(# bar int,
highgo(# name varchar(100)
highgo(# ) ON COMMIT DELETE ROWS;
CREATE TABLE
highgo=# begin;
BEGIN
highgo=*# insert into foo2 values(1,’highgo’);
INSERT 0 1
highgo=*# select * from foo2;
bar | name
-—-+——–
1 | highgo
(1 row)
highgo=*# end;
COMMIT
highgo=# select * from foo2;
bar | name
-—-+——
(0 rows)
限制
- 全局临时表上不能指定任何外键约束(foreign key constraints)
- 全局临时表不能包含嵌套表的列
- 全局临时表不支持并行UPDATE、DELETE和MERGE
- 全局临时表不能包含 INVISIBLE列
- 全局临时表不支持并行操作