首页 > 解决方案 > MV 刷新不删除数据

问题描述

专家们,

我需要帮助才能在 Oracle 中创建一个物化视图,该视图在从基表中删除时不会从 MV 中删除数据。

我的基表:

1) create table one11 (aa INT, bb INT, cc varchar2(10));
2) alter table one11 add primary key(aa);
3) insert into one11 values(1,1,'AA');
4) insert into one11 values(2,1,'BB');
5) insert into one11 values(3,1,'CC');

6)CREATE MATERIALIZED VIEW LOG ON ONE11 
WITH PRIMARY KEY, SEQUENCE, ROWID(BB, CC) 
INCLUDING NEW VALUES;

7)CREATE MATERIALIZED VIEW one11_mv
REFRESH FAST
START WITH (SYSDATE) NEXT (SYSDATE + interval '1' minute)  AS
select * from one11;

8)select * from one11_mv; --After 1 min
AA  BB  CC
1   1   AA
2   1   BB
3   1   CC

9) delete from one11 where aa= 3; --After 1 min
AA  BB  CC
1   1   AA
2   1   BB

----
The expected result from MV after delete statement
AA  BB  CC
1   1   AA
2   1   BB
3   1   CC

TIA

标签: oracle

解决方案


否。要刷新 MV 中的数据,您有两个选择:

  • 完全刷新:重新运行MV中的查询
  • 快速刷新:应用 MV 日志中的所有更改

无论哪种方式,您都会丢失已删除的行。因此,如果您想从基表中删除行,但将它们保留在 MV 中,则必须更改策略。

您可以这样做的方法包括:

  • 滚动你自己的 MV:在插入/更新时将所有内容复制到另一个表
  • 更改为软删除:is_deleted向表中添加一个标志并将所有更改deletesupdates设置此标志。然后 MV 可以包含这些“已删除”的行,而所有其他应用程序代码将它们隐藏起来

推荐阅读