1. 程式人生 > >【PostgreSQL】臨時表

【PostgreSQL】臨時表

cnblogs drop select end 登錄 不同 postgre 臨時表 found

PostgreSQL中的臨時表分兩種,一種是會話級臨時表,一種是事務級臨時表。在會話級臨時表中,數據可以存在於整個會話的生命周期中,在事務級臨時表中的數據只能存在於事務的生命周期中。
1. 會話級臨時表

##創建會話級臨時表,PG中默認創建的就是會話級的。
test=# create TEMPORARY table tmp1 (id int primary key,note text);
CREATE TABLE

##查看表屬性,schema為“pg_temp_x”,其中“x”代表一個數字,不同的sessionzhege
test
=# \d List of relations Schema | Name | Type | Owner -----------+------+-------+---------- pg_temp_3 | tmp1 | table | postgres (1 row) ##退出會話 test=# \q ##重新登錄會話 [[email protected] bin]$ psql test; psql (8.4.18, server 9.6.3) WARNING: psql version 8.4, server version 9.6
. Some psql features might not work. Type "help" for help. ##再次查看,臨時表已經消失 test=# \d No relations found.

2. 事務級臨時表
在創建事務級臨時表語句中需要加上"on commit delete rows"子句。

##創建事務級臨時表
test=# create TEMPORARY table tmp2 (id int primary key,note text) on commit delete rows;
CREATE TABLE

##開始一個事務
test
=# begin; BEGIN ##插入測試數據 test=# insert into tmp2 values (1,Tom); INSERT 0 1 test=# insert into tmp2 values (2,Peter); INSERT 0 1 ##查看表中數據 test=# select * from tmp2; id | note ----+------- 1 | Tom 2 | Peter (2 rows) ##結束事務 test=# end; COMMIT ##再次查看,表中數據已經消失,因為事務級臨時表中數據只存在於事務的生命周期中 test=# select * from tmp2; id | note ----+------ (0 rows)

總結:
1. 不管是會話級還是事務級的臨時表,當會話結束後,臨時表會消失,這和Oracle數據庫不同。Oracle數據庫當會話結束後,數據消失,而表依然存在。
2. "ON COMMIT" 子句有三種形式,默認使用的是PRESERVE ROWS:
(1)ON COMMIT PRESERVE ROWS 表示臨時表的數據在事務結束後保留;
(2)ON COMMIT DELETE ROWS 表示臨時表的數據在事務結束後truncate掉;
(3)ON COMMIT DROP 表示臨時表在事務結束後刪除。

The End!

2017-08-15

【PostgreSQL】臨時表