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

目录
创建 PostgreSQL 临时表
顾名思义,临时表是在数据库会话期间存在的短期表。PostgreSQL 在会话或事务结束时自动删除临时表。
要创建临时表,请使用CREATE TEMPORARY TABLE语句,如下:
CREATE TEMPORARY TABLE temp_table_name(
column_list
);
在这个语法中:
- 首先,在
CREATE TEMPORARY TABLE关键字后指定临时表的名称。 - 其次,指定列列表,与
CREATE TABLE语句中的列列表相同。
TEMP和TEMPORARY关键字是等效的,因此您可以互换使用它们:
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语句没有专门为临时表创建的TEMP或TEMPORARY关键字。
例如,以下语句删除我们在上例中创建的临时表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 TABLE和DROP TABLE语句创建和删除它。