从选择中创建临时表,或者如果表已存在则插入

问题描述 投票:0回答:1

如果临时表尚不存在,如何创建临时表,并向其中添加选定的行?

sql postgresql ddl
1个回答
73
投票

CREATE TABLE AS

是最简单、最快的方法:

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

请勿将

SELECT INTO
用于此目的。参见:

不确定表是否已经存在

CREATE TABLE IF NOT EXISTS ...
是在 Postgres 9.1 中添加的。对于旧版本,请参阅:

然后:

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

如果临时表已经存在,您的代码中可能会出现问题。确保您没有重复表中的数据或其他内容。或者考虑以下段落...

独特的名字

临时表仅在当前会话中可见(不要与事务混淆!)。所以表名不能与其他会话冲突。 如果您在会话中需要唯一的名称,您可以使用动态 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()
currval(regclass)
有助于返回动态创建的表名称。

© www.soinside.com 2019 - 2024. All rights reserved.