如何仅更新数据库转储中的某些属性sql / text / csv或任何其他格式

问题描述

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

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

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

感谢您对提出数据库级别方法的建议提出任何帮助。预先感谢。

解决方法

解决方案:

通过使用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,则可以删除它。

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