【问题标题】:Create a temporary table from a selection or insert if table already exist从选择中创建一个临时表,如果表已经存在则插入
【发布时间】:2013-09-21 22:36:54
【问题描述】:

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

【问题讨论】:

  • 可以升级到 9.1 或更高版本吗?这些版本支持create table .. if not exists
  • 你知道 8.4 将在明年年中取消支持吗?无论如何,您都应该计划升级:postgresql.org/support/versioning
  • Ofc 我知道,我支付托管费用,所以我想他们会尽快升级版本。不依赖我...

标签: postgresql


【解决方案1】:

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

【讨论】:

  • 补充一点,如果您需要指定事务行为,请在“as”部分之前执行:create temp table tbl ON COMMIT DROP as [您的强大选择去了这里]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2010-10-24
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
相关资源
最近更新 更多