分类
PostgreSQL支持两种临时表:
- 会话级临时表:数据可以一直保存在整个会话的生命周期中
- 事务级临时表:数据只存在于这个事务的生命周期中
在PostgreSQL中,不管是事务级的临时表还是会话级的临时表,当会话结束时都会消失,这与Oracle数据库不同,在Oracle数据库中,只是临时表中的数据消失,而临时表还存在。
如果在两个不同的session中创建一个同名的临时表,实际上创建的是两张不同的表。
默认情况下创建的临时表是会话级的。
会话级临时表
创建一张临时表,通过查看发现,临时表是生成的一个特殊的Schema下的表,这个Schema名为“pg_temp_xx”其中xx代表一个数字,但是不同的session是不同的。
另打开一个psql(session),查看当前的表:
从上面的结果可以看到,在另一个session中直接用“\d”命令是看不到这张表的,加上Schema后可以查看到,但是不能访问。
事务级临时表
从上面的示例中可以看出,事务一旦结束,这种临时表中的数据就会消失。
实际上“ON COMMIT”子句有以下3种形式:
- ON COMMIT PRESERVE ROWS:若不带“ON COMMIT”子句,默认情况下,数据会一直存在于整个会话周期中
- ON COMMIT DELETE ROWS:数据只存在于事务周期中,事务提交后数据就消失了
- ON COMMIT DROP:数据值存在于事务周期中,事务提交后临时表就消失了。这种情况下,创建临时表的语句与插入数据的语句需要放到一个事务中,若把创建临时表的语句放在一个单独的事务中,事务一旦结束,这张临时表就会消失。
创建临时表时,关键字“TEMPORARY”也可以缩写成“TEMP”
create TEMPORARY table tmp_t1(id int primary key,note text);
create TEMP table tmp_t1(id int primary key,note text);
以上两条SQL语句是等价的
PG为了能够与其他数据库的临时表语句兼容,还没有“GLOBAL”和“LOCAL”两个关键字,加与不加都是一样的效果。