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

How to only UPDATE certain attributes from a Database dump(sql/text/csv or any other format)

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

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

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

感谢任何以数据库级别方式建议解决方案的帮助。提前致谢。

解法:

通过使用 postgres_fdw 你可以很容易地做到这一点。请在您要更新 table:

的新数据库上执行以下提到的步骤

步骤 - 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:创建与远程数据库

具有相同结构的外部 Table
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');

现在您可以像在本地 table 一样在查询中使用 local_table_name 但它会在远程数据库上执行所有操作。

你的更新查询可以这样写:

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

如果您觉得以后不需要,可以删除 remote_table

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

我发现我可以在旧版本的 DBeaver (7.1.3) 中执行此操作,但不能在较新版本中执行此操作。 如果您 运行 脚本“select column1, column3,... from your_table” 询问您需要的列的数据,然后右键单击结果和菜单打开后,您可以仅使用 select 结果中的字段生成 sql->update。 我不知道为什么他们从新版本中采用了这个非常有用的功能。也许现在有另一种方法,但我找不到。