用数据更新了表“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怎么用一个表的多个字段数据更新另一个表相应的字段中