【问题标题】:pg_dump vs COPY (SELECT * FROM my_table)pg_dump 与 COPY (SELECT * FROM my_table)
【发布时间】:2014-04-23 18:54:35
【问题描述】:

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

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

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

【问题讨论】:

  • 这太疯狂了。你能显示输出吗?
  • /tmp/my_table.sql 中有多少条记录?

标签: sql pg-dump postgresql-9.0


【解决方案1】:

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 会有所帮助)。

如果不是,那么我不确定 - 我想知道是否可能涉及规则或触发器,但我目前不知道如何。不过,也许它会给其他人一个想法……?

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2023-03-08
    • 2014-02-14
    • 2011-08-15
    • 2022-12-27
    相关资源
    最近更新 更多