pg_dump vs COPY(SELECT*FROM my_table)

Axl*_*Axl 5 sql pg-dump postgresql-9.0

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

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

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

pg_dump -a -t '"my_table"' my_database > /tmp/my_table.sql
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我只得到8条记录,如果我像这样查看表格,表格中有超过1000条记录:

SELECT * FROM my_table;
Run Code Online (Sandbox Code Playgroud)

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

COPY my_table TO '/tmp/my_table.csv' WITH CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

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

COPY (SELECT * FROM my_table) TO '/tmp/my_table.csv' WITH CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

我得到了所有1266条记录.

我会假设这些命令都应该返回相同的数据,但显然,我错了.有什么不同?

Jus*_*ick 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;
Run Code Online (Sandbox Code Playgroud)

如果只返回 8 条记录,那么我们就走在正确的轨道上,我们只需要找到子表(对此,如何查找从 PSQL 中的另一个表继承的子表将很有帮助)。

如果没有,那么我不确定 - 我想知道规则或触发器是否参与其中,但我目前不知道如何参与。不过,也许它给了其他人一个想法......?