postgresql - Postgres备份并覆盖一张表

标签 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

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

任何建议都会很棒,谢谢!

最佳答案

根据您的数据和 fkey 限制,您基本上有两个选择。

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

  1. 锁定表格
  2. 截断
  3. 加载

这将避免其他事务看到一个空表。

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

  1. 将数据载入临时表
  2. 锁定目标表(可选,见上文)
  3. 使用可写的 cte 在表中“更新插入”。
  4. 使用单独的删除语句从表中删除数据。

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

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

希望这对您有所帮助。

关于postgresql - Postgres备份并覆盖一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061483/

相关文章:

postgresql - 时间戳列上的 date_trunc 不返回任何内容

mysql - 如何在 PostgreSQL 中仅获取数据库的表名

PostgreSQL 无法从服务器 : Software caused connection abort (0x00002745/10053) 接收数据

Postgresql服务器远程连接

sql - postgres 中的条件索引和触发器

regex - Postgres Regex返回逗号前的第一个词和逗号后的第一个词

postgresql - 为什么 != 和 <> 都存在于 postgres 中?

c# - 如何使用带有 Entity Framework Code First 的 Postgresql 的串行字段

postgresql - 写入特殊符号时出现postgresql错误

postgresql - 在 Postgresql 中创建全局变量