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

Posted

技术标签:

【中文标题】将数据从一个表更新到另一个表(在数据库中)【英文标题】:update data from one table to another (in a database) 【发布时间】:2009-11-25 21:04:34 【问题描述】:

数据库专家,

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

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

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

如果系统重新启动,或者我的服务重新启动,我想重新初始化表 B。但是,我希望尽可能少地更新数据库。具体来说,我想:

添加任何在表 A 中但不在表 B 中的行,并且 删除不在表 A 中但在表 B 中的所有行 表 A 和表 B 共有的任何行都应保持不变

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

【问题讨论】:

【参考方案1】:

使用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)

【讨论】:

我喜欢这个,但它不能处理现有行在表 A 和表 B 之间发生变化的情况。对此有什么建议吗? 我是这样更新的:***.com/questions/1829311/…【参考方案2】:

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

您可以根据需要将其配置为细粒度(即,只需几个表)。

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

如果由于某种原因 ER 不能用于您的配置,我建议重写通知模型以异步运行,即:

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

所以服务器“B”负责确保其副本与“A”同步。 'B' 不可用并不会给'A' 带来不便。

【讨论】:

ER 似乎是首选机制;它是自动的,因此是可靠的,并且开销最小。它确实假设这些表在一​​个记录的数据库中,并且这些表有一个主键(当然,设计良好的表应该有)。 您还可以查看 IDS 11.50 中的变更数据捕获 (CDC) 机制。请注意,告诉我们 IDS 的版本会有所帮助。【参考方案3】:

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

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

【讨论】:

如果维护表 B 的服务出现故障,则它不会处理任何更改表 A 的更新通知。因此,当服务恢复时,它需要重新同步。【参考方案4】:

根据共同列连接两个表中的数据,这将为您提供在两个表中都有匹配的行,即 A 和 B 中的数据。然后使用这个值(让我们称之为集合 M)和集合操作,即设置减法运算以获得差异。

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

你明白了吗?

【讨论】:

【参考方案5】:

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

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

所以我用谷歌搜索并发现 Informix also supports the same MERGE 声明,但我不确定它是否也处理删除,尽管插入和更新正在处理。而且,这个语句自己处理事务

【讨论】:

以上是关于将数据从一个表更新到另一个表(在数据库中)的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一个表更新到另一个表并在新的 ms 访问 .net 时插入

如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)

创建触发器以将数据从一个表获取到另一个表并生成时间戳

如何在同一个表中将数据从一列复制到另一列?

Oracle 将一个表中几个字段更新到另一个表中

如何复制一个表到另一个数据库中