6

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

我打算从旧表中转储表数据,然后将其简单地导入到新数据库中的空表中。但是,我在使用 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 条记录。

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

4

1 回答 1

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 条记录,那么我们就走在了正确的轨道上,我们只需要找到子表(对此如何查找从 PSQL 中的另一个表继承的子表将很有帮助)。

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

于 2014-04-29T02:34:43.097 回答