Postgresql 从所选内容创建临时表,如果表已存在,则插入

Postgresql 从所选内容创建临时表,如果表已存在,则插入,postgresql,Postgresql,如果临时表不存在,如何创建临时表并将所选行添加到其中 是最简单、最快的方法: CREATE TEMP TABLE tbl AS SELECT * FROM tbl WHERE ... ; 不要使用选择进入。见: 不确定表是否已经存在 在Postgres 9.1版中引入。 对于旧版本,请使用此相关答案中提供的功能: 然后: 如果临时表已经存在,那么代码中可能会出现错误。确保不要在表或其他地方重复数据。或者考虑下面的段落… 唯一名称 临时表仅在当前会话中可见(不要与事务混淆!)。因此,

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

是最简单、最快的方法:

CREATE TEMP TABLE tbl AS
SELECT * FROM tbl WHERE ... ;
不要使用
选择进入
。见:

不确定表是否已经存在 在Postgres 9.1版中引入。
对于旧版本,请使用此相关答案中提供的功能:

然后:

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

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

创建一次:

CREATE SEQUENCE tablename_helper_seq;
您可以使用
DO
语句(或plpgsql函数):


有助于返回动态创建的表名。

是否可以升级到9.1或更高版本?这些版本支持
create table。。如果不存在
您知道8.4将在明年年中取消支持吗?无论如何,你应该计划升级:Ofc我知道,我为托管付费,所以我想他们会尽快升级版本。不依靠我。。。
CREATE SEQUENCE tablename_helper_seq;
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$;