代码之家  ›  专栏  ›  技术社区  ›  rouble

将数据从一个表更新到另一个表(在数据库中)

  •  2
  • rouble  · 技术社区  · 15 年前

    DB大师

    我希望有人能给我指明正确的方向。

    我有两张桌子。表A和表B。当系统启动时,表A中的所有条目都被按摩并复制到表B(根据表B的模式)。表A可以有数万行。

    当系统启动时,表B通过数据库更改通知与表A保持同步。

    如果系统重新启动,或者我的服务重新启动,我想重新初始化表B。但是,我想用最少的数据库更新来完成这项工作。具体来说,我想:

    • 添加表A中但表B中没有的任何行,以及
    • 删除不在表A中但在表B中的任何行
    • 表A和表B共用的任何行都应保持原样

    现在,我不是一个“数据库员”,所以我想知道传统的方法是什么。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Donnie    15 年前

    使用 exists 把处理量降到最低。

    沿着这些线修改了一些东西,使连接正确(同时验证我没有做一些愚蠢的事情,并得到 TableA TableB 背离你的描述):

    insert into TableB
        select 
            *
        from
            TableA a
        where
            not exists (select 1 from TableB b where b.ID = a.ID)
    
    delete from 
        TableB b
    where
        not exists (select 1 from TableA a where a.ID = b.ID)
    
        2
  •  1
  •   RET    15 年前

    Informix的企业复制功能将为您完成所有这些工作。ER的工作方式是将逻辑日志从一台服务器发送到另一台服务器,然后在辅助服务器上向前滚动。

    您可以根据需要将其配置为细粒度(即只有一小部分表)。

    您使用术语“数据库更改通知”-您是否已经使用ER,或者这是基于触发器的安排?

    如果由于某种原因,ER不能为您的配置工作,我建议重写通知模型,使其异步工作,即:

    • 将通知写入服务器“a”中包含时间戳或串行字段的表
    • 在服务器“b”上创建一个表,该表存储上次处理的记录的时间戳/序列值。
    • 在服务器“b”上运行一个守护进程,该进程:
      • 比较“a”和“b”时间戳/序列
      • 在“a”和“b”时间戳之间选择“a”记录
      • 将这些记录处理为“B”
      • 更新“b”时间戳/序列号
      • 在适当的时间段内睡眠,然后循环

    因此服务器“b”负责确保其副本与“a”同步。“B”不可用不会给“A”带来不便。

        3
  •  0
  •   David Brunelle    15 年前

    一种简单的方法是使用一个历史表,在该表中,您将放置自上次更新以来发生的从A到B的更改,并使用该表同步表B,而不是从A到B的直接副本。同步完成后,删除整个历史表并重新开始。

    我不明白的是,如果您的服务或计算机没有运行,如何更新表A而不是B。它们是在两个不同的数据库或服务器上找到的吗?

        4
  •  0
  •   paweloque    15 年前

    根据Comon列连接两个表中的数据,这将给您两个表中匹配的行,即A和B中的数据。然后将此值(让我们称之为集合M)与集合操作(即集合减号操作)一起使用以获得差异。

    第一项要求:A减去M 第二要求:B减去A 第三项要求:m

    你知道这个主意吗?

        5
  •  0
  •   priyanka.sarkar    15 年前

    我是一个SQL Server人员,但是自从SQL Server 2008以来,对于这种操作,一个功能调用 MERGE 可用。

    通过使用MERGE语句,我们可以在单个语句中执行插入、更新和删除操作。

    所以我在谷歌上找到了 Informix also supports the same MERGE 语句,但我不确定它是否也处理删除,尽管插入和更新被取消了。此外,此语句本身处理事务