我需要将表的内容从一个数据库复制到另一个数据库,并使用相同的表,该表当前为空。
我计划从旧表中转储表数据,然后将其导入新数据库中的空表。但是,我遇到了一些我不理解使用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条记录。
我认为这些命令应该都返回相同的数据,但显然,我错了。有什么区别?
答案 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将有用)。
如果没有,那么我不确定 - 我想知道是否可能涉及规则或触发器,但我现在无法看到。不过,也许它给了别人一个想法......?