如果临时表不存在,如何创建临时表,并将所选行添加到临时表中?

推荐答案

将表创建为

这是最简单、最快的方法:

CREATE TEMP TABLE tbl AS
SELECT * FROM tbl WHERE ... ;

不要使用SELECT INTO.见:

不确定表是否已经存在

CREATE TABLE IF NOT EXISTS ... was introduced in version Postgres 9.1.
For older versions, use the function provided in this related answer:

然后:

INSERT INTO tbl (col1, col2, ...)
SELECT col1, col2, ...

如果临时表已经存在,那么代码中可能出现了错误.确保不要在表或其他地方重复数据.或者考虑以下段落…

唯一的名字

临时表仅在当前会话中可见(不要与事务混淆!).因此表名不能与其他会话冲突.If如果会话中需要唯一的名称,可以使用动态SQL并使用SEQUENCE:

创建一次:

CREATE SEQUENCE tablename_helper_seq;

可以使用DO语句(或plpgsql函数):

DO
$do$
BEGIN
   EXECUTE
   'CREATE TEMP TABLE tbl' || nextval('tablename_helper_seq'::regclass) || ' AS
    SELECT * FROM tbl WHERE ... ';

   RAISE NOTICE 'Temporary table created: "tbl%"' || ', lastval();
END
$do$;

lastval() and currval(regclass)有助于返回动态创建的表名.

Postgresql相关问答推荐

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

如何在不同的行中显示两列,避免重复并省略空条目

如何获取在 Go 中完成的 SQL 插入的错误详细信息?

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

PostgreSQL TIMESTAMPTZ 不适用于 SpringBoot Java Query

为什么 postgresql 可以在这个查询中高效地使用索引?

在 jOOQ 中 Select 相同的命名列

联合所有 postgresql Select 子句保留顺序

有没有办法使用postgresql将具有不同ID的同一行多次添加到表中?

PostgreSQL:如何避免被零除?

用于生产的 Rails 性能调优?

在 Postgres 中查询 JSON 对象数组

PostgreSQL 在 mySQL 中的 date_trunc

Docker - Postgres 和 pgAdmin 4:Connection refused

PostgreSQL:将时间戳转换为时间 - 或仅从时间戳列中检索时间

postgresql:致命:password authentication failed for user "douglas"

错误:prepared statement "S_1" already exists

如何查询前 10 行,下一次从表中查询其他 10 行

如何获取一个月的天数?

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环