参考文档:
http://postgres.cn/docs/11/sql-createtable.html
http://postgres.cn/docs/10/sql-createview.html

--- 基于会话的临时表(默认),会话结束,表消失
-- 会话1中创建临时表,在当前会话中查看该表 ,可以看到该表的schema为pg_temp_5,可以访问该表

create temporary table tmp_t1 (id int primary key,name text);
mydb=# create temporary table tmp_t1 (id int primary key,name text);
CREATE TABLE
mydb=# \d
               List of relations
  Schema   |      Name      | Type  |  Owner   
-----------+----------------+-------+----------
 pg_temp_5 | tmp_t1         | table | postgres
 public    | pg_buffercache | view  | postgres
 public    | pub_t1         | table | postgres
 public    | t              | table | postgres
(4 rows)
mydb=# 
mydb=# select * from pg_temp_5.tmp_t1;
 id | name 
----+------
(0 rows)
mydb=# 

-- 重新开一个会话,查看表,发现看不到该临时表 ,但是尝试加上schema,可以看到该表,尝试访问该表,不允许

mydb=# \d
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | pg_buffercache | view  | postgres
 public | pub_t1         | table | postgres
 public | t              | table | postgres
(3 rows)
mydb=# 
mydb=# \d pg_temp_5.tmp_t1
             Table "pg_temp_5.tmp_t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           | not null | 
 name   | text    |           |          | 
Indexes:
    "tmp_t1_pkey" PRIMARY KEY, btree (id)
mydb=# 
mydb=# select * from pg_temp_5.tmp_t1;
ERROR:  cannot access temporary tables of other sessions
mydb=#

-- 在会话1中插入数据,会话2中仍然是查询不到数据的

insert into tmp_t1 values(1,'aaa'),(2,'bbb');
mydb=# insert into tmp_t1 values(1,'aaa'),(2,'bbb');
INSERT 0 2
mydb=# select * from tmp_t1;
 id | name 
----+------
  1 | aaa
  2 | bbb
(2 rows)
mydb=# 
mydb=# select * from pg_temp_5.tmp_t1;
ERROR:  cannot access temporary tables of other sessions
mydb=#

--测试,离开会话。可以看到,默认情况下,临时表是会话级别的。离开这个会话,再次连接数据库,发现这个表消失了

mydb=# \q
[root@test /root]$psql -d mydb
psql.bin (10.15)
Type "help" for help.
mydb=# \d
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | pg_buffercache | view  | postgres
 public | pub_t1         | table | postgres
 public | t              | table | postgres
(3 rows)
mydb=# 

-- 基于事务的临时表 ,事务结束,表还是存在的,但是表中数据不存在了

create temporary table tmp_t2 (id int primary key,name text) on commit delete rows;
insert into tmp_t2 values(1,'aaa'),(2,'bbb');  -- 如果这样,使用自动提交事务,则插入语句后,查询结果是0记录
mydb=# create temporary table tmp_t2 (id int primary key,name text) on commit delete rows;
CREATE TABLE
mydb=# \d
               List of relations
  Schema   |      Name      | Type  |  Owner   
-----------+----------------+-------+----------
 pg_temp_4 | tmp_t2         | table | postgres
 public    | pg_buffercache | view  | postgres
 public    | pub_t1         | table | postgres
 public    | t              | table | postgres
(4 rows)

-- 在事务中查看

begin ;
insert into tmp_t2 values(1,'aaa'),(2,'bbb');
select * from tmp_t2 ;
mydb=# begin ;
BEGIN
mydb=# select * from tmp_t2;
 id | name 
----+------
(0 rows)
mydb=# insert into tmp_t2 values(1,'aaa'),(2,'bbb');
INSERT 0 2
mydb=# select * from tmp_t2;
 id | name 
----+------
  1 | aaa
  2 | bbb
(2 rows)
mydb=# 
mydb=# \d pg_temp_4.tmp_t2   -- 在另一个会话中查看 ,可以看到表,但是不允许访问  
mydb=# \d pg_temp_4.tmp_t2
             Table "pg_temp_4.tmp_t2"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           | not null | 
 name   | text    |           |          | 
Indexes:
    "tmp_t2_pkey" PRIMARY KEY, btree (id)
mydb=# select * from pg_temp_4.tmp_t2;
ERROR:  cannot access temporary tables of other sessions
mydb=# 

-- 结束事务,再次查看表,结果是事务结束,表中数据消失,表还存在 。

mydb=# commit;
COMMIT
mydb=# \d
               List of relations
  Schema   |      Name      | Type  |  Owner   
-----------+----------------+-------+----------
 pg_temp_4 | tmp_t2         | table | postgres
 public    | pg_buffercache | view  | postgres
 public    | pub_t1         | table | postgres
 public    | t              | table | postgres
(4 rows)
mydb=# select * from tmp_t2;
 id | name 
----+------
(0 rows)
mydb=# \d
               List of relations
  Schema   |      Name      | Type  |  Owner   
-----------+----------------+-------+----------
 pg_temp_4 | tmp_t2         | table | postgres
 public    | pg_buffercache | view  | postgres
 public    | pub_t1         | table | postgres
 public    | t              | table | postgres
(4 rows)
mydb=#  

-- 临时视图,当创建一个临时视图的时候,会话结束后,视图消失

create temp view v_pub_t1 as select * from pub_t1 where id <10;
select count(*) from v_pub_t1;
mydb=# create temp view v_pub_t1 as select * from pub_t1 where id <10;
CREATE VIEW
mydb=# \d v_pub_t1
                        View "pg_temp_5.v_pub_t1"
  Column  |            Type             | Collation | Nullable | Default 
----------+-----------------------------+-----------+----------+---------
 id       | integer                     |           |          | 
 name     | text                        |           |          | 
 crt_time | timestamp without time zone |           |          | 
\d: extra argument ";" ignored
mydb=# 
mydb=# select count(*) from v_pub_t1;
 count 
-------
(1 row)
mydb=# 
mydb=# \d
               List of relations
  Schema   |      Name      | Type  |  Owner   
-----------+----------------+-------+----------
 pg_temp_5 | v_pub_t1       | view  | postgres
 public    | pg_buffercache | view  | postgres
 public    | pub_t1         | table | postgres
 public    | t              | table | postgres
(4 rows)
mydb=# 

-- 在备库上能看到这个视图吗?经过测试,在备库上,是看不到这个视图的

-- 断开会话,再次查看,发现视图不见了

mydb=# \c mydb
You are now connected to database "mydb" as user "postgres".
mydb=# \d
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | pg_buffercache | view  | postgres
 public | pub_t1         | table | postgres
 public | t              | table | postgres
(3 rows)
mydb=# 
参考文档:http://postgres.cn/docs/11/sql-createtable.htmlhttp://postgres.cn/docs/10/sql-createview.html--- 基于会话的临时表(默认),会话结束,表消失-- 会话1中创建临时表,在当前会话中查看该表 ,可以看到该表的schema为pg_temp_5,可以访问该表create temporary table tmp_t1 (id int primary key,name text);mydb=#
PostgreS QL支持两类临时 ,会话级和事务级临时 。在会话级别的临时 中,在整个会话的生命周期中,数据一直保存。事务级临时 ,数据只存在于这个事务的生命周期中。不指定临时 的属性, PostgreS QL中,不管是事务级还是会话级临时 ,当会话结束时,临时 就会消失。这与oracle数据库不同,在oracle数据库中,只是临时 中的数据消失,而临时 还存在。 创建临时 temp
PostgreS QL中的临时 分两种,一种是会话级临时 ,一种是事务级临时 。 在会话级临时 中,数据可以存在于整个会话的生命周期中; 在事务级临时 中的数据只能存在于事务的生命周期中。 默认创建的是会话级别的临时 。 不管是会话级还是事务级的临时 ,当会话结束后,临时 就会被回收。 “ON COMMIT” 子句有三种形式,默认使用的是PRESERVE ROWS,即会话临时 : 1)ON COMMIT PRESERVE ROWS 示临时 的数据在事务结束后保留,默认值, 示会话级临时 ; 2)ON COM
Postgres ql中临时 (temporary table)的特性和用法 【 PostgreS QL-9.6.3】临时 PostgreS QL SELECT INTO和INSERT INTO SELECT 两种 复制语句 如何在 postgres ql 函数中创建临时 ??? 临时 解释: PostgreS QL中的临时 分两种,一种是会话级临时 ,一种是事务级临时 。在会话级临时 ...
ddxu: 您好,我在Oracle 19C执行 EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/oracle/database/', DBMS_LOGMNR_D.STORE_IN_FLAT_FILE); 的时候报错invalid directory object,大佬知道可能是什么原因吗? 需要使用新应用以打开此WindowsDefender链接 拯救阿标: Reset-AppxPackage : 无法将“Reset-AppxPackage”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如 果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 51 + Get-AppxPackage Microsoft.SecHealthUI -AllUsers | Reset-AppxPackage + ~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Reset-AppxPackage:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 需要使用新应用以打开此WindowsDefender链接 拯救阿标: 大佬知道怎么解决了码 mysql_config_editor的配置 白话机器学习: 通过文章可以看出,博主很有耐心,技术文章不仅是对技术的坚守,更是对知识的热忱和热爱,感谢您的优质分享和坚持更文。期待着博主更加深入的剖析,为大家带来更多的技术好文。