从 PostgreSQL 获取临时 table 创建语句

Getting temporary table creation statements from PostgreSQL

在 PostgreSQL 中,您可以非常轻松地创建临时 table:

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

有什么简单的方法可以为 table 获取创建语句吗?我可以进行查询以获取有关 table 结构的信息(例如,在 psql 中我可以使用 \d),但这并没有给我可以使用的创建语句。

我想要这样,这样我就可以在一个 PostgreSQL 数据库中具体化查询,获取查询的 table 结构,在另一个数据库中创建临时 table,然后使用 COPY 命令在继续之前将数据从一个复制到另一个。

最简单的技巧是使用 pg_dump:

$ pg_dump -s -t tmp_foo _dbname_

当然,这只适用于非临时table。但是你也可以只创建一个常规的 table 并做一个像 pg_dump ... | psql ...pg_dump ... | pg_restore ... 这样的管道来完成你的任务。

一般来说,如果您需要考虑列默认值、外键、检查约束等,重建 CREATE TABLE 语句会变得相当复杂。

但是CREATE TABLE AS ...语句的产物不会有这些,所以相对简单。将您的 table 名称插入此查询的 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;