postgresql - 计划将数据从 dblink 插入到本地表中
Posted
技术标签:
【中文标题】postgresql - 计划将数据从 dblink 插入到本地表中【英文标题】:postgresql - Schedule Insert data from dblink to a local table In a 【发布时间】:2012-06-19 10:01:29 【问题描述】:我正在尝试使用 dblink 将远程数据库链接到本地数据库。这里要实现的是:
我只想每 10 秒从远程数据库中的表中获取最新行的数据。
我希望将本地数据库中的数据插入到预先存在的表中。在这种情况下,我希望将我从远程数据库收集的数据,以及其他一些数据(如主键)和一些我从远程数据库没有得到的序列插入到表中。
任何建议将不胜感激。
【问题讨论】:
【参考方案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...干杯!以上是关于postgresql - 计划将数据从 dblink 插入到本地表中的主要内容,如果未能解决你的问题,请参考以下文章