【问题标题】:postgresql - Schedule Insert data from dblink to a local table In apostgresql - 计划将数据从 dblink 插入到本地表中
【发布时间】:2012-06-19 10:01:29
【问题描述】:

我正在尝试使用 dblink 将远程数据库链接到本地​​数据库。这里要实现的是:

  1. 我只想每 10 秒从远程数据库中的表中获取最新行的数据。

  2. 我希望将本地数据库中的数据插入到预先存在的表中。在这种情况下,我希望将我从远程数据库收集的数据,以及其他一些数据(如主键)和一些我从远程数据库没有得到的序列插入到表中。

任何建议将不胜感激。

【问题讨论】:

    标签: postgresql scheduled-tasks dblink


    【解决方案1】:
    • 您需要远程表中的索引列,每次插入或更新行时都会增加(不是时间戳,因为许多行可以具有相同的时间戳,计算机时钟有时会倒退ETC。)。如果您从不更新,那么串行主键就足够了(如果您决定依赖此触发器,则强制使用触发器不允许更新)。删除也不会同步,所以我建议强制他们也不允许使用触发器。

    • 您需要一个 cron(或 Windows 上的调度程序)作业来连接到您的数据库并执行同步,因为 PostgreSQL 没有定期任务的机制。

    • 这项工作只需要:

      开始交易;
      以独占模式锁定表 local_tablename;
      dblink_connect(…);
      插入 local_tablename (id, data, row_counter)
        选择 * 从 dblink(
          '从 remote_tablename 中选择 id、data、row_counter
             where row_counter>'||(select coalesce(max(row_counter),-1) from local_tablename)
        ) as t(id int, data text, row_counter int);
      提交;

      它需要处于事务中并用锁保护,因为如果它与另一个同步作业同时运行(例如,如果前一个作业花费超过 10 秒),它可能会中断。

      如果 `local_tablename` 还没有行,则需要`coalesce` - 如果没有它,它将不会插入任何内容。它假定总是 `row_counter>=0`。

    【讨论】:

    • 在这种情况下,我还会使用 dblink,还是有更好的选择来实现我想要实现的目标? @tometzky?
    • 我认为 dblink 将是最简单的方法。我已经更新了我的答案,使其更加清晰。
    • 您好@tometzky,您的解决方案运行良好,并且正在从插入到我的数据库中的远程数据库中获取数据,但现在我注意到数据是按顺序插入的。我从远程数据库的三列中获取数据,但它插入到我本地数据库的前 3 列中。我想要一个状态,我可以决定将哪些数据插入到哪里,并且我有机会在某些列中插入一些默认值。如果您不介意进一步解释,我将不胜感激......
    • 嘿 - 做你的功课。这是基本的SQL insert syntax - insert into table_name (column_name1, column_name2, column_name3) select …。我更新了我的问题,它在插入中使用列名。
    • 非常感谢。这就是我所需要的。我以前从未与 dblink 合作过.. 很抱歉很多 qns...干杯!
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多