24

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

4

1 回答 1

49

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)有助于返回动态创建的表名。

于 2013-09-20T15:22:42.500 回答