在PostgreSQL中,您可以使用以下命令轻松创建临时表:
CREATE TEMPORARY TABLE tmp_foo AS
SELECT bar, baz FROM some_table WHERE ...;
有没有简单的方法来获取该表的create语句?我可以进行查询以获取有关表结构的信息(例如在psql中我可以使用\d
)但是这并没有给我一个我可以使用的创建语句。
我希望这样我可以在一个PostgreSQL数据库中实现查询,获取查询的表结构,在另一个中创建该临时表,然后使用COPY
命令将数据从一个复制到另一个在继续之前。
答案 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 ...
之类的管道来完成任务。