从PostgreSQL获取临时表创建语句

时间:2015-12-11 20:56:10

标签: postgresql temp-tables

在PostgreSQL中,您可以使用以下命令轻松创建临时表:

CREATE TEMPORARY TABLE tmp_foo AS
SELECT bar, baz FROM some_table WHERE ...;

有没有简单的方法来获取该表的create语句?我可以进行查询以获取有关表结构的信息(例如在psql中我可以使用\d)但是这并没有给我一个我可以使用的创建语句。

我希望这样我可以在一个PostgreSQL数据库中实现查询,获取查询的表结构,在另一个中创建该临时表,然后使用COPY命令将数据从一个复制到另一个在继续之前。

2 个答案:

答案 0 :(得分:2)

通常,如果需要考虑列默认值,外键,检查约束等,重构CREATE TABLE语句会变得非常复杂。

但是CREATE TABLE AS ...声明的产品不具备任何此类声明,因此它相对简单。将表名插入此查询的WHERE子句中:

SELECT
  format(
    'CREATE TEMP TABLE %s (%s)',
    attrelid::regclass,
    string_agg(
      format(
        '%I %s',
        attname,
        format_type(atttypid, atttypmod)
      ),
      ','
      ORDER BY attnum
    )
  )
FROM pg_attribute
WHERE
  attrelid = 'tmp_foo'::regclass AND
  attnum > 0 AND
  NOT attisdropped
GROUP BY attrelid

作为旁注,而不是这样做:

CREATE TEMP TABLE tmp_foo AS SELECT ... ;
COPY tmp_foo TO STDOUT;

...您可以在不实际运行结果的情况下获取SELECT结果的结构,从而避免创建数据的中间副本:

CREATE TEMP TABLE tmp_foo AS SELECT ... WITH NO DATA;
COPY (SELECT ...) TO STDOUT;

答案 1 :(得分:0)

最简单的方法是使用pg_dump

$ pg_dump -s -t tmp_foo _dbname_

当然,这只适用于非临时表。但您也可以创建一个常规表格并执行pg_dump ... | psql ...pg_dump ... | pg_restore ...之类的管道来完成任务。