我有一个 postgres 数据库,我正在尝试备份一个表:
pg_dump --data-only --table=<table> <db> > dump.sql
然后几天后我试图通过以下方式覆盖它(基本上是想删除所有数据并从我的转储中添加数据):
psql -d <db> -c --table=<table> < dump.sql
但它不会覆盖,它会在不删除现有数据的情况下添加它。
任何建议都会很棒,谢谢!
最佳答案
根据您的数据和 fkey 限制,您基本上有两个选择。
如果表没有 fkeys,那么最好的办法是在加载之前截断表。请注意,截断在事务中的行为有点奇怪,因此最好的做法是(在事务 block 中):
- 锁定表格
- 截断
- 加载
这将避免其他事务看到一个空表。
如果你有 fkeys 那么你可能想加载到一个临时表然后做一个 upsert。在这种情况下,如果其他事务可能想要写入表(也在事务 block 中),您可能仍然希望锁定表以避免竞争条件:
- 将数据载入临时表
- 锁定目标表(可选,见上文)
- 使用可写的 cte 在表中“更新插入”。
- 使用单独的删除语句从表中删除数据。
第 3 阶段有点棘手。你可能需要问一个单独的问题,但基本上你将有两个阶段(并在与文档协商后写这个):
- 更新现有记录
- 插入不存在的记录
希望这对您有所帮助。
关于postgresql - Postgres备份并覆盖一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061483/