首页 > 解决方案 > 如何仅更新数据库转储中的某些属性(sql/text/csv 或任何其他格式)

问题描述

我有从表的某些列中提取数据的特定要求(对于某些记录,由唯一 ID 标识)并在另一个表中更新具有相同 ID 的记录,并在列中使用相同的值。

我使用的数据库是 Postgresql。我希望是否有一种方法可以通过使用数据库工具(DBeaver、PG Admin 等)进行提取,我可以使用该工具从一个 DB 中提取并将值保存在另一个 DB 中。我尝试从 DBeaver 中提取值,但它们是Insert INTO语句,会创建重复记录。

我的外行解决方案是提取 CSV,然后通过 Rake 任务逐行读取来更新记录。

任何有关建议解决方案的 DB 级别方式的帮助表示赞赏。提前致谢。

标签: databasepostgresqlinsert-updatedbeaverdata-recovery

解决方案


解决方案:

通过使用postgres_fdw你可以很容易地做到这一点。请在要更新表的新数据库上按照以下提到的步骤操作:

步骤 - 1:创建扩展

create extension postgres_fdw;

步骤 - 2:创建远程服务器

create server remote_server
foreign data wrapper postgres_fdw
options(host 'remote_server', dbname 'remote_dbname', port '5432'); 

步骤 - 3:为服务器创建外部用户映射

create user mapping for localuser
server remote_server
options(user 'remoteuser', password 'remoteuser_password');

步骤 - 4:创建与远程数据库中结构相同的外部表

create foreign table "schema_name"."remote_table"
(
id_ int;
...
-- field list same as foreign table in other db
)
server remote_server
options(SCHEMA_NAME 'foreign_schema', TABLE_NAME 'foreign_name');

现在您可以local_table_name在查询中使用本地表,但它将在远程数据库上执行所有操作。

您的更新查询可以编写如下:

update local_table p1
set 
-- your set statements
.....
.....
from remote_table p2
where p1.id = p2.id;

remote_table如果您觉得以后不需要它,您可以放弃。

注意: -仅当两个数据库都在同一台服务器上或两个数据库可以相互通信(如果在不同的服务器上)时,上述方法才有效。


推荐阅读