DB大师,
我希望有人可以设定我正确的方向。
我有两张桌子。表A和表B.当系统启动时,表A中的所有条目都被按摩并复制到表B(根据表B的模式)。表A可以有数万行。
系统启动时,表B通过数据库更改通知与表A保持同步。
如果系统重新启动,或者我的服务重新启动,我想重新初始化表B.但是,我想用最少的数据库更新来执行此操作。具体来说,我想:
现在,我不是一个“数据库人”,所以我想知道这样做的传统方式是什么。
答案 0 :(得分:2)
使用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)
答案 1 :(得分:1)
Informix的Enterprise Replication功能可以为您完成所有这些工作。 ER的工作原理是将逻辑日志从一个服务器发送到另一个服务器,然后在辅助服务器上向前滚动。
您可以根据需要将其配置为细粒度(即只有少数表格)。
您使用术语“数据库更改通知” - 您是否已经使用ER或者这是一些基于触发器的安排?
如果由于某些原因ER无法用于您的配置,我建议重写通知模型以异步行为,即:
因此服务器'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 声明,但我不确定它是否也会处理删除,尽管插入和更新正在处理中。此外,本声明单独负责交易