PostgreSQL 教程: 临时表

九月 8, 2023

摘要:在本教程中,您将了解 PostgreSQL 的临时表以及如何有效管理它。

PostgreSQL Temporary Table

创建 PostgreSQL 临时表

顾名思义,临时表是在数据库会话期间存在的短期表。PostgreSQL 在会话或事务结束时自动删除临时表。

要创建临时表,请使用CREATE TEMPORARY TABLE语句,如下:

CREATE TEMPORARY TABLE temp_table_name(
   column_list
);

在这个语法中:

  • 首先,在CREATE TEMPORARY TABLE关键字后指定临时表的名称。
  • 其次,指定列列表,与CREATE TABLE语句中的列列表相同。

TEMPTEMPORARY关键字是等效的,因此您可以互换使用它们:

CREATE TEMP TABLE temp_table(
   ...
);

临时表仅对创建它的会话可见。换句话说,它对其他会话是不可见的。

让我们看一个例子。

首先,使用psql程序登录到 PostgreSQL 数据库服务器,并创建一个名为test新数据库

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres-# \c test;
You are now connected to database "test" as user "postgres".

接下来,创建一个临时表,名为mytemp,如下:

test=# CREATE TEMP TABLE mytemp(c INT);
CREATE TABLE
test=# SELECT * FROM mytemp;
 c
---
(0 rows)

然后,启动另一个连接到test数据库的会话,并从mytemp表中查询数据:

test=# SELECT * FROM mytemp;
ERROR:  relation "mytemp" does not exist
LINE 1: SELECT * FROM mytemp;

从输出中可以清楚地看到,第二个会话看不到mytemp表。只有第一个会话可以访问它。

之后,退出所有会话:

test=# \q

最后,再次登录数据库服务器,从mytemp表中查询数据:

test=# SELECT * FROM mytemp;
ERROR:  relation "mytemp" does not exist
LINE 1: SELECT * FROM mytemp;
                      ^

mytemp表不存在,因为它在会话结束时已自动删除,因此 PostgreSQL 发出错误。

PostgreSQL 临时表名称

临时表可以与普通表同名,但不建议这样做。

当您创建与普通表同名的临时表时,在临时表被删除之前您无法访问普通表。考虑以下示例:

首先,创建一个表,名为customers

CREATE TABLE customers(
   id SERIAL PRIMARY KEY, 
   name VARCHAR NOT NULL
);

其次,创建和customers表同名的临时表:

CREATE TEMP TABLE customers(
    customer_id INT
);

现在,从customers表中查询数据:

SELECT * FROM customers;
 customer_id
-------------
(0 rows)

这次 PostgreSQL 访问的是临时表customers而不是普通表。

请注意,PostgreSQL 在特殊模式中创建临时表,因此,您不能在CREATE TEMP TABLE语句中指定模式。

如果要在test数据库中列出表,您将只能看到临时表customers,而看不到普通表:

                 List of relations
  Schema   |       Name       |   Type   |  Owner
-----------+------------------+----------+----------
 pg_temp_3 | customers        | table    | postgres
 public    | customers_id_seq | sequence | postgres
(2 rows)

输出显示customers临时表的模式为pg_temp_3

在这种情况下,要访问普通表,您需要使用完全限定名称,即以模式为前缀。例如:

SELECT * FROM public.customers;

删除 PostgreSQL 临时表

要删除临时表,请使用DROP TABLE语句。以下语句使用 DROP TABLE 语句删除临时表:

DROP TABLE temp_table_name;

CREATE TABLE语句不同,DROP TABLE语句没有专门为临时表创建的TEMPTEMPORARY关键字。

例如,以下语句删除我们在上例中创建的临时表customers

DROP TABLE customers;

如果再次列出test数据库中的表,普通表customers将显示如下:

test=# \d
                List of relations
 Schema |       Name       |   Type   |  Owner
--------+------------------+----------+----------
 public | customers        | table    | postgres
 public | customers_id_seq | sequence | postgres
(2 rows)

在本教程中,您了解了临时表以及如何使用CREATE TEMP TABLEDROP TABLE语句创建和删除它。