问题描述
我有一个特殊的要求,即从表的某些列中提取数据(对于某些记录,由唯一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
,则可以删除它。
注意:-仅当两个数据库都在同一服务器上或两个数据库可以相互通信(如果在不同的服务器上)时,以上操作才有效。