如果表已经存在,从选择或插入创建一个临时表。

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

你能升级到9.1或更高版本吗?这些版本支持create table .. if not exists - user330315
2
你知道8.4版将在明年年中停止支持吗? 无论如何,你都应该计划升级:http://www.postgresql.org/support/versioning/ - user330315
当然,我知道,我为托管付费,所以我想他们会尽快升级版本。这不取决于我... - inf3rno
1个回答

72

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)对于返回动态创建的表名至关重要。


4
如果您需要指定事务行为,可以在 "as" 部分之前进行设置:create temp table tbl ON COMMIT DROP as [您的查询语句]。 - Anatoly Alekseev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接