pg_dump vs COPY(SELECT * FROM my_table)

时间:2014-04-23 18:54:35

标签: sql pg-dump postgresql-9.0

我需要将表的内容从一个数据库复制到另一个数据库,并使用相同的表,该表当前为空。

我计划从旧表中转储表数据,然后将其导入新数据库中的空表。但是,我遇到了一些我不理解使用pg_dump的行为。

我尝试使用以下命令将表数据转储到文件中:

pg_dump -a -t '"my_table"' my_database > /tmp/my_table.sql

这样可行,但我只能获得8条记录,如果我像这样查看表格,表格中有超过1000条记录:

SELECT * FROM my_table;

所以,我尝试使用COPY命令生成.csv文件,我看到类似的行为:

COPY my_table TO '/tmp/my_table.csv' WITH CSV HEADER;

我得到与pg_dump相同的8条记录。但是,用:

COPY (SELECT * FROM my_table) TO '/tmp/my_table.csv' WITH CSV HEADER;

我获得了所有1266条记录。

我认为这些命令应该都返回相同的数据,但显然,我错了。有什么区别?

1 个答案:

答案 0 :(得分:3)

my_table是否可能是继承层次结构的一部分?我问,因为http://www.postgresql.org/docs/9.0/interactive/sql-copy.html#AEN58984有这个:

  

COPY仅处理名为的特定表;它不会将数据复制到子表或从子表复制数据。因此,例如COPY table TO显示与SELECT * FROM ONLY table相同的数据。但COPY (SELECT * FROM table) TO ...可用于转储继承层次结构中的所有数据。

您应该可以通过运行来检查:

SELECT * FROM ONLY my_table;

如果只返回8条记录,那么我们就在正确的轨道上,我们只需找到子表(How to find child tables that inherit from another table in PSQL将有用)。

如果没有,那么我不确定 - 我想知道是否可能涉及规则或触发器,但我现在无法看到。不过,也许它给了别人一个想法......?