九月 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
语句创建和删除它。