用数据更新了表“c”,此更新应再次更新表“a”和表“b”中的列

Posted

技术标签:

【中文标题】用数据更新了表“c”,此更新应再次更新表“a”和表“b”中的列【英文标题】:Updated a Table "c" with data and this update should again update a column in table "a" and table "b" 【发布时间】:2019-09-10 19:38:46 【问题描述】:

我的表 C 有多个列,表 C 的一列中的任何更新都必须更新表 a 和 b 中的列

关系 b/w table @ db level 是 none,只有一列包含 table a 和 b 中的一些关键信息,没有别的。

现在我正在从一个 JAVA 应用程序中执行此操作,但我有数百万条记录要循环通过是否有可能在 DB 本身中实现这一点,就像内置的 oracle 功能...

我是如何做到这一点的,我在考虑触发器,但我说使用触发器不好。

我们尝试使用 java 应用程序,但循环数百万条记录非常耗时

没有DB关系b / w表A B和c,除了我们在表A和B中保留表C的portID的一些信息。我将无法在DB级别更改关系

表 C:

portID  State 
6001     1 -------> Updated to 2 
6002     1

然后

表 A:

portID  State 
6001     1 -------> after Table C update this should also Updated to 2

表 B:

portID  State 
6001     1 -------> after Table C update this should also Updated to 2

如果我可以改变这些表之间的关系,我该如何实现,以便 DB 可以处理更新 A 和 B 表?

【问题讨论】:

为什么?在C 中查找值,这样您就不会在一堆表中重复数据。 使用 java 应用程序执行此操作,每当更新表 c 时,您查询表 a 和 b 中带有 portid x 的所有行,但更新大记录需要大量时间并导致性能问题... .如何像触发器一样实现这个@ DB级别.... 触发器不太可能在这里更有效地执行任何操作。您可能会遇到与触发器相同的性能问题。这就是为什么非规范化数据是一个问题的原因——如果你试图更新它,你必须在多个地方更新它,而不仅仅是一个地方。 portID 是否在 A 和 B 中编入索引? ohh okie.. 是的,它是 A 和 B 中的索引列 如果我可以改变这些表之间的关系,我该如何实现,以便 DB 可以处理更新 A 和 B 表? 【参考方案1】:

您可以在 Oracle 中使用 AFTER 触发器来执行此操作。我给你举个例子:

CREATE OR REPLACE TRIGGER "trg_upd_tbl_a_tbl_b"
AFTER UPDATE ON c
REFERENCING NEW AS New OLD as Old
FOR EACH ROW
BEGIN
    IF UPDATING THEN
        UPDATE a SET a.state=:New.state WHERE portID=:New.portID;
        UPDATE b SET b.state=:New.state WHERE portID=:New.portID;
    END IF;
END;

【讨论】:

我看到很多人提到触发器不是一个理想的解决方案......而且我的应用程序包含数百万的大量数据......你认为触发器会很好还是和我的应用程序一样有性能问题... 触发器是一种方式,因为您对表所做的后续更改将包含在单个事务中。通过这种方式,您可以确保数据的完整性。 谢谢....我有点犹豫要不要使用...让我在最后的手段实施此触发器之前探索可能的解决方案。

以上是关于用数据更新了表“c”,此更新应再次更新表“a”和表“b”中的列的主要内容,如果未能解决你的问题,请参考以下文章

oracle怎么用一个表的多个字段数据更新另一个表相应的字段中

kettle 插入更新 和表输出的区别

MYSQL 如何自动更新另一个表?

Oracle A表更新B表

sql 如何批量更新,如一个mdb数据库,里面表A和表B的用户卡号,现在要更新A表里 累计次数

在视图中更新数据 - oracle