Postgres备份并覆盖一个表

时间:2016-05-05 22:43:18

标签: postgresql postgresql-9.1 psql pg-dump

我有一个postgres数据库,我正在尝试使用以下内容备份表:

pg_dump --data-only --table=<table> <db> > dump.sql

几天后,我试图覆盖它(基本上想要删除所有数据并从我的转储中添加数据):

psql -d <db> -c --table=<table> < dump.sql

但它不会覆盖,它会在不删除现有数据的情况下添加它。

任何建议都很棒,谢谢!

1 个答案:

答案 0 :(得分:2)

您基本上有两个选项,具体取决于您的数据和fkey限制。

如果表中没有fkeys,那么最好的办法就是在加载表之前截断表。请注意,truncate在事务中表现得有些奇怪,所以最好的办法是(在事务块中):

  1. 锁定表格
  2. 截断
  3. 加载
  4. 这将避免其他交易看到空表。

    如果您有fkeys,那么您可能需要加载到临时表中然后执行upsert。在这种情况下,如果其他事务可能想要写入表(也在事务块中),您可能仍希望锁定表以避免竞争条件:

    1. 将数据加载到临时表中
    2. 锁定目标表(可选,见上文)
    3. 使用可写的cte在表格中“upsert”。
    4. 使用单独的delete语句删除表中的数据。
    5. 第3阶段有点棘手。您可能需要单独提出一个问题,但基本上您将有两个阶段(并在与文档协商后写下):

      1. 更新现有记录
      2. 插入不存在的记录
      3. 希望这有帮助。