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

时间:2009-11-25 21:04:35

标签: sql database informix

DB大师,

我希望有人可以设定我正确的方向。

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

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

如果系统重新启动,或者我的服务重新启动,我想重新初始化表B.但是,我想用最少的数据库更新来执行此操作。具体来说,我想:

  • 添加表A中的所有行,但不添加表B和
  • 删除表A中没有但在表B中
  • 的所有行
  • 表A和表B中常见的任何行都应保持不变

现在,我不是一个“数据库人”,所以我想知道这样做的传统方式是什么。

5 个答案:

答案 0 :(得分:2)

使用exists将处理保持在最低限度。

沿着这些方面做了一些修改,以便连接正确(同时验证我没有做一些愚蠢的事情,并从你的描述中向后移动TableATableB):

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)

答案 1 :(得分:1)

Informix的Enterprise Replication功能可以为您完成所有这些工作。 ER的工作原理是将逻辑日志从一个服务器发送到另一个服务器,然后在辅助服务器上向前滚动。

您可以根据需要将其配置为细粒度(即只有少数表格)。

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

如果由于某些原因ER无法用于您的配置,我建议重写通知模型以异步行为,即:

  • 将通知写入服务器“A”中包含时间戳或序列字段
  • 的表
  • 在服务器“B”上创建一个表,用于存储上次处理的记录的时间戳/序列值
  • 在服务器'B'上运行守护进程:
    • 比较'A'和'B'时间戳/连续出版物
    • 选择“A”和“B”时间戳之间的“A”记录
    • 将这些记录处理为“B”
    • 更新'B'时间戳/序列号
    • 睡觉适当的时间段,并循环

因此服务器'B'负责确保其副本与'A'同步。 “A”不会因'B'不可用而造成不便。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

根据comon列连接来自两个表的数据,这将为您提供两个表中匹配的行,即A和B中的数据。然后使用此值(让我们调用此集M)与set操作,即设置减去操作以获得差异。

第一个要求:A减M 第二次要求:B减A 第三个要求:M

你明白了吗?

答案 4 :(得分:0)

我是一名Sql Server人员但是从Sql Server 2008开始,对于这种操作,可以使用功能调用MERGE

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

所以我用Google搜索并发现Informix also supports the same MERGE 声明,但我不确定它是否也会处理删除,尽管插入和更新正在处理中。此外,本声明单独负责交易