Sql 使用dblink在2个数据库之间更新无效

Sql 使用dblink在2个数据库之间更新无效,sql,postgresql,sql-update,dblink,Sql,Postgresql,Sql Update,Dblink,基本上我有2个数据库,每个数据库包含2个表。我需要使用数据库1中的表更新数据库2中的内容 下面是数据库1表2 db1 ta2 pid | pname | pcompany | clocation | did | name 1 Pirates Argos London 1 Mary 数据库2表1 db1 tb1 pid | pname | pcompany | 1 Ba Ba

基本上我有2个数据库,每个数据库包含2个表。我需要使用数据库1中的表更新数据库2中的内容

下面是数据库1表2 db1 ta2

pid  |   pname  |  pcompany  |  clocation  |  did  |   name
 1       Pirates    Argos        London        1       Mary
数据库2表1 db1 tb1

pid  |   pname        |  pcompany  |
 1       Ba Ba Black      Argos       
现在我需要将“babablack”更新为Pirates,这意味着我需要从db1ta2更新db2tb1

但我有一个错误:


知道我搞砸了什么吗?

添加表/列别名,最有可能的情况如下:

UPDATE tb1 b
SET    name = a.pname   -- maybe you want to update *pname* instead?
FROM  (
   SELECT *
   FROM   dblink('port=5432 dbname=db1 user=postgres  password=12345'
               , 'SELECT pname FROM ta1 WHERE pid = 1')
          AS t(pname text)
   ) a
WHERE b.pid = 1;
假设输入文本。适应你的实际类型。 表中没有逗号。
我没有将a链接到b,因为a在这里只返回一行。

我的工作方式如下:

DO$$
DECLARE
 sql_statement TEXT;
BEGIN
 sql_statement:='UPDATE public.ta2 SET name='''||NEW.name||''' WHERE pid=1;';
PERFORM public.dblink('port=5432 dbname=db1 user=postgres  password=*',sql_statement);
RETURN NEW;
END;
$$
languaje plpgsql;

您可以参考以下链接:

为什么这个令人困惑的示例使用DB2TB1和DB1TA2,而不是DB1TB1和DB2TB2?你能解开它吗?因为我在每个数据库中有两个不同的表。ta1和ta2在DB1A中,bs与DB2A一起,这与您的应用程序相关,但不是为了这个问题..我不知道我做错了什么。。。为什么会出现这样的错误呢?我已经试过了,你不需要一个整数,b字符20,c整数。当我使用ta1名称字符20但保留与您相同的内容时,它会这样说:错误:列名不存在上下文:在名为unnamed的dblink连接上发生错误:无法执行查询。@DodoSerebro:看起来您的列名实际上是pname?它仍然在设置行中给我一个缺少的FROM子句2@DodoSerebro:对不起,忘记了此处提供列定义列表所需的包装SELECT语句。它现在表示错误:FROM中的子查询必须有别名行3:FROM^提示:例如,FROM SELECT。。。[作为]福。
UPDATE tb1 b
SET    name = a.pname   -- maybe you want to update *pname* instead?
FROM  (
   SELECT *
   FROM   dblink('port=5432 dbname=db1 user=postgres  password=12345'
               , 'SELECT pname FROM ta1 WHERE pid = 1')
          AS t(pname text)
   ) a
WHERE b.pid = 1;
DO$$
DECLARE
 sql_statement TEXT;
BEGIN
 sql_statement:='UPDATE public.ta2 SET name='''||NEW.name||''' WHERE pid=1;';
PERFORM public.dblink('port=5432 dbname=db1 user=postgres  password=*',sql_statement);
RETURN NEW;
END;
$$
languaje plpgsql;