Postgres备份和覆盖一个表

5

我有一个Postgres数据库,我想备份一张表:

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

几天后,我试图通过以下方式覆盖它(基本上想要擦除所有数据并添加来自我的转储的数据):

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

但它不会覆盖已有数据,而是在现有数据的基础上添加。

如果有任何建议,将不胜感激,谢谢!


1
这是可以预料的 - 转储只是 SQL COPY 语句。您可以在数据加载之前加上 TRUNCATE <table>,或将其添加到您的 dump.sql 文件的顶部。 - jmelesky
2
或者,使用 --clean 运行 pg_dump,以“在输出用于创建它们的命令之前输出清理(删除)数据库对象的命令”。 - Ezequiel Tolnay
1个回答

3
您基本上有两个选项,取决于您的数据和fkey约束条件。
如果没有fkeys到表,则最好的做法是在加载之前截断表。请注意,在事务中truncate的行为有点奇怪,因此最好的方法是(在事务块中):
  1. 锁定表
  2. 截断
  3. 加载
这将避免其他事务看到一个空表。
如果您有fkeys,则可能需要加载到临时表中,然后执行upsert操作。在这种情况下,您可能仍然希望锁定表以避免竞争条件,如果可能,其他事务可能想要写入表(也在事务块中):
  1. 将数据加载到临时表中
  2. 锁定目标表(可选,参见上文)
  3. 使用可写的cte在表中执行“upsert”。
  4. 使用单独的删除语句从表中删除数据。
第3阶段有点棘手。您可能需要就此提出单独的问题,但基本上您将有两个阶段(并在文档协商后编写):
  1. 更新现有记录
  2. 插入不存在的记录
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接