从 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;
在 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;