Postgres 备份并覆盖一个 table

Postgres backup and overwrite one table

我有一个 postgres 数据库,我正在尝试用 :

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

然后几天后我试图通过以下方式覆盖它(基本上是想删除所有数据并从我的转储中添加数据):

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

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

任何建议都很棒,谢谢!

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

如果 table 没有 fkey,那么最好的办法是在加载前截断 table。请注意,截断在事务中的行为有点奇怪,因此最好的做法是(在事务块中):

  1. 锁定table
  2. 截断
  3. 加载

这将避免其他事务看到空 table。

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

  1. 将数据加载到临时文件中table
  2. 锁定目的地table(可选,见上文)
  3. 在 table.
  4. 中对 "upsert" 使用可写的 cte
  5. 使用单独的删除语句从 table.
  6. 中删除数据

第 3 阶段有点棘手。您可能需要就此提出一个单独的问题,但基本上您将有两个阶段(并在与文档协商后编写):

  1. 更新现有记录
  2. 插入不存在的记录

希望对您有所帮助。