PostgreSQL 临时表[通俗易懂]

PostgreSQL 临时表[通俗易懂]转载自: http://blog.163.com/digoal@126/blog/static/1638770402012101575032326/SQL标准中临时表是一次创建,以后使用的时候无须再次创建的.并且每个会话保持各自的数据.但是在PostgreSQL中,临时表的使用有所改变.1.临时表在会话结束后会自动删除(或者在事务结束后删除oncommitdrop)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定


SQL标准中临时表是一次创建, 以后使用的时候无须再次创建的. 并且每个会话保持各自的数据.
但是在PostgreSQL中, 临时表的使用有所改变.
1. 临时表在会话结束后会自动删除(或者在事务结束后删除on commit drop). 也就是说每个会话中需要使用临时表的话需要重新创建.
    这个有好处也有坏处, 好处是不同的会话能够使用同名但是不同结构的临时表. SQL标准无法做到. 
    坏处是新建的会话如果只是要使用同名同结构的临时表也有重新创建. 
2. 临时表可以选择在事务结束后删除数据或者保留数据或者删除表.

【语法】

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

Jetbrains全家桶1年46,售后保障稳定

红色部分是与临时表有关的. 其中GLOBAL和LOCAL在这个语法中是一样的, 没有分别, 但是在SQL标准中是不一样的.
ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP 
PRESERVE ROWS 
表示临时表的数据在事务结束后保留.
DELETE ROWS 表示
临时表的数据在事务结束后truncate掉.
DROP 
表示
临时表在事务结束后删除.
默认使用的是
PRESERVE ROWS.

【例子】
1. 
临时表在会话结束后会自动删除(或者在事务结束后删除on commit drop).
 
会话1 : 

pg9 . 2.0@db - 172 - 16 - 3 - 150 -> psql digoal digoal
psql ( 9.2 . 0 )
Type "help" for help .
digoal=> create temp table t(id int);
CREATE TABLE
digoal=> select relname,relnamespace,oid from pg_class where relname='t';
 relname | relnamespace |  oid  
---------+--------------+-------
 t       |        41192 | 41203
(1 row)
digoal=> select nspname from pg_namespace where oid=41192;
  nspname  
-----------
 pg_temp_2
(1 row)

退出会话1后重进, 临时表已经被删除了.

digoal=> \q
pg9.2.0@db-172-16-3-150-> psql digoal digoal
psql (9.2.0)
Type "help" for help.
digoal=> select nspname from pg_namespace where oid=41192;
  nspname  
-----------
 pg_temp_2
(1 row)
digoal=> select relname,relnamespace,oid from pg_class where relname='t';
 relname | relnamespace | oid 
---------+--------------+-----
(0 rows)


2. 
每个会话中需要使用临时表的话需要重新创建. 
好处是不同的会话能够使用同名但是不同结构的临时表.
会话1

pg9.2.0@db-172-16-3-150-> psql digoal digoal
psql (9.2.0)
Type "help" for help.
digoal => create temp table t ( id int );
CREATE TABLE

会话2

pg9.2.0@db-172-16-3-150-> psql digoal digoal
psql (9.2.0)
Type "help" for help.
digoal=> create temp table t(id text,id2 int);
CREATE TABLE
digoal=> select relname,relnamespace,oid from pg_class where relname='t';
 relname | relnamespace |  oid  
---------+--------------+-------
 t       |        11194 | 41206
 t       |        41192 | 41209
(2 rows)
digoal=> select nspname from pg_namespace where oid in (11194, 41192);
  nspname  
-----------
 pg_temp_1
 pg_temp_2
(2 rows)

会话3

pg9.2.0@db-172-16-3-150-> psql digoal digoal
psql (9.2.0)
Type "help" for help.
digoal=> create temp table t(id text,id2 int,info text);
CREATE TABLE
digoal=> select relname,relnamespace,oid from pg_class where relname='t';
 relname | relnamespace |  oid  
---------+--------------+-------
 t       |        11194 | 41206
 t       |        41192 | 41209
 t       |        41215 | 41217
(3 rows)
digoal=> select nspname from pg_namespace where oid in (11194, 41192, 41215);
  nspname  
-----------
 pg_temp_1
 pg_temp_2
 pg_temp_3
(3 rows)


3. 
临时表可以选择在事务结束后删除数据或者保留数据或者删除表.

digoal=> begin;
BEGIN
digoal=> create temp table test (id int) on commit preserve rows;
CREATE TABLE
digoal=> create temp table test1 (id int) on commit delete rows;
CREATE TABLE
digoal=> create temp table test2 (id int) on commit drop;
CREATE TABLE
digoal=> select relname,relnamespace,oid from pg_class where relname in ('test', 'test1', 'test2');
 relname | relnamespace |  oid  
---------+--------------+-------
 test    |        41215 | 41223
 test1   |        41215 | 41226
 test2   |        41215 | 41232
(3 rows)
digoal=> insert into test values (1);
INSERT 0 1
digoal=> insert into test1 values (1);
INSERT 0 1
digoal=> commit;
COMMIT

事务提交后test2已经被自动drop掉了.

digoal=> select relname,relnamespace,oid from pg_class where relname in ('test', 'test1', 'test2');
 relname | relnamespace |  oid  
---------+--------------+-------
 test    |        41215 | 41223
 test1   |        41215 | 41226
(2 rows)

test的数据事务提交后数据保留.

digoal=> select * from test;
 id 
----
  1
(1 row)

test1的数据事务提交后数据已删除.

digoal=> select * from test1;
 id 
----
(0 rows)

test2在事务提交后表已删除.

digoal=> select * from test2;
ERROR:  relation "test2" does not exist
LINE 1: select * from test2;
                      ^


4. 如果有临时表和非临时表重名了, 那么默认是使用临时表的, 如果要使用非临时表, 需要带上schema, 如schema.table.

digoal=> create table dup_table_name (id int);
CREATE TABLE
digoal=> create temp table dup_table_name (id int);
CREATE TABLE
digoal=> insert into digoal.dup_table_name values (1);
INSERT 0 1
digoal=> select * from dup_table_name ;
 id 
----
(0 rows)
digoal=> insert into dup_table_name values (2);
INSERT 0 1
digoal=> select * from dup_table_name ;
 id 
----
  2
(1 row)
digoal=> select * from digoal.dup_table_name ;
 id 
----
  1
(1 row)


5. 临时表上创建的索引也是临时的.

digoal=> create index idx_test on dup_table_name (id);
CREATE INDEX
digoal=> \d dup_table_name 
Table "pg_temp_3.dup_table_name"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
Indexes:
    "idx_test" btree (id)
digoal=> \di idx_test 
                   List of relations
  Schema   |   Name   | Type  | Owner  |     Table      
-----------+----------+-------+--------+----------------
 pg_temp_3 | idx_test | index | digoal | dup_table_name
(1 row)


6. 临时表无法选择性的创建在某个schema下面, 它是存在于临时schema的, 例如pg_temp_?. 对应的TOAST表也在临时的schema下, 例如(pg_toast_temp_?) . 虽然无法选择schema但是tablespace是可以指定的.

digoal=> create temp table digoal.tmp_test (id int);
ERROR:  cannot create temporary relation in non-temporary schema


7. PostgreSQL 中临时表的统计信息不会被autovacuum daemo自动收集. 所以如果有复杂查询的话, 最好再有DML后自己执行analyze.

【小结】
1. 如果有临时表和非临时表重名了, 那么默认是使用临时表的, 如果要使用非临时表, 需要带上schema, 如schema.table.
2. 临时表上创建的索引也是临时的.
3. 临时表无法选择性的创建在某个schema下面, 它是存在于临时schema的, 例如pg_temp_?. 对应的TOAST表也在临时的schema下, 例如(pg_toast_temp_?) . 虽然无法选择schema但是tablespace是可以指定的.
4. PostgreSQL 中临时表的统计信息不会被autovacuum daemo自动收集. 所以如果有索引的情况下, 最好再有DML后自己执行analyze.

【参考】

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210102.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【MQTT】在Windows下搭建MQTT服务器

    【MQTT】在Windows下搭建MQTT服务器最近在项目中要使用MQTT协议,需要搭建一个MQTT服务器来进行调试,在网络上找了一天,找到的大多数都是MQTT客户端,最后发现这篇博客写的教程可以使用,特此记录。

    2022年6月14日
    30
  • Flask中使用Werkzeug「建议收藏」

    Flask中使用Werkzeug「建议收藏」Flask中有两大核心:Jinja2和WerkzeugWerkzeug是一个遵循WSGI协议的python函数库数据库中直接存放明文密码是很危险的,Werkzeug库中的security能够方便的实现散列密码的计算security库中generate_password_hash(password,method…)函数将原始密码作为输入,以字符串形式输出密码的散列值check_…

    2022年10月7日
    1
  • 基于物品的协同过滤算法:理论说明,代码实现及应用「建议收藏」

    基于物品的协同过滤算法:理论说明,代码实现及应用「建议收藏」基于物品的协同过滤算法:理论说明,代码实现及应用标签:爬虫Python主要参考资料:项亮.推荐系统实践[M].北京:人民邮电出版社,2012.转载请注明出处:sss0.一些碎碎念从4月中旬开始,被导师赶到北京的郊区搬砖去了,根本就没有时间学习看书,这个时候才知道之前的生活是多么的幸福:每天看自己想看的书,然后实践一下,最后写博文总结一下,偶尔还能去跑个步,游个泳。想找实习的计划也泡汤了

    2022年6月26日
    23
  • 选择排序-Java「建议收藏」

    选择排序-Java「建议收藏」堆排序理论:https://blog.csdn.net/qq_36186690/article/details/82505569代码:packagecom.paixu.paixuTest;importjava.util.Arrays;importjava.util.Scanner;/***选择排序*1)简单选择排序*2)堆排序*/publicclassxuanZhePaiXu{publicstaticvoidmain(String[]a

    2022年7月8日
    24
  • fulltext mysql_mysql深入理解全文索引fulltext及实例剖析

    fulltext mysql_mysql深入理解全文索引fulltext及实例剖析本文章通过以下几个小章节向大家介绍 mysql 全文索引的相关知识 mysql 全文索引原理及使用条件如何创建全文索引全文索引的基本语法及使用方法全文索引使用实例 mysql 全文索引使用条件首页要先明白 mysql 的全文检索原理 mysql 使用的是一个非常简单的剖析器来将文本分隔成词 空格 标点等 比如 welcomtoyou 将分隔为三个词 welcom to you 但是对中文来说 比如

    2025年7月28日
    7
  • C语言strstr函数_strstr函数c语言实现

    C语言strstr函数_strstr函数c语言实现C语言strstr函数查找字符串的函数,语法规则char*strstr(constchar*string,constchar*strCharSet)用于查找字符串strCharSet是否为字符串string的子字符串,需要引用头文件#include<string.h>使用方法如下:intmain(){ chararr1[]=”Thisisanexercise”; chararr2[]=”anexercise”; char*ret1

    2022年10月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号