国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

解決物化視圖刷新過程中的約束沖突問題

2024-07-21 02:43:40
字體:
來源:轉載
供稿:網友
本文中,我們通過實例的方法來幫助您理解物化視圖刷新過程中出現的約束沖突問題。

即使將物化視圖的約束建立和基表完全一致,由于物化視圖的刷新機制,也會產生約束沖突的現象。

以下是一個簡單的示例:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));--表已創建

SQL> ALTER TABLE T ADD CONSTRAINT UN_T_NAME UNIQUE (NAME);--表已更改

SQL> CREATE MATERIALIZED VIEW LOG ON T;

--實體化視圖日志已創建:

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS SELECT * FROM T;

--實體化視圖已創建。

SQL> ALTER TABLE MV_T ADD CONSTRAINT UN_MV_T_NAME UNIQUE (NAME);

--表已更改:

SQL> INSERT INTO T VALUES (1, 'A');

--已創建 1 行:

SQL> INSERT INTO T VALUES (2, 'B');

--已創建 1 行:

SQL> COMMIT;

--提交完成:

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

--PL/SQL 過程已成功完成。

上面構造了一個簡單的物化視圖,物化視圖和基表建立了相同的唯一約束。

下面進行一個循環的更新操作,然后觀察刷新的情況:

SQL> UPDATE T SET NAME = 'C' WHERE ID = 1;

--已更新 1 行。

SQL> UPDATE T SET NAME = 'A' WHERE ID = 2;

--已更新 1 行。

SQL> UPDATE T SET NAME = 'B' WHERE ID = 1;

--已更新 1 行。

SQL> COMMIT;

--提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;

*

ERROR 位于第 1 行:

ORA-12008: 實體化視圖的刷新路徑中存在錯誤

ORA-00001: 違反唯一約束條件 (YANGTK.UN_MV_T_NAME)

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832

ORA-06512: 在line 1

刷新失敗了。解決這個問題的一個方法是對于物化視圖不建立唯一約束,唯一性由基表保證。但是這種方法只對只讀物化視圖適用。而且,缺少唯一約束信息,可能會影響SQL的執行計劃。

這種情況下,最好的解決方法是建立延遲約束。

SQL> ALTER TABLE MV_T DROP CONSTRAINT UN_MV_T_NAME;

--表已更改。

SQL> ALTER TABLE MV_T ADD CONSTRAINT

UN_MV_T_NAME UNIQUE (NAME) DEFERRABLE;

--表已更改。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

--PL/SQL 過程已成功完成。

注釋:延遲唯一約束對應的索引也必須是非唯一的,否則無法達到延遲約束的目的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜兴市| 安国市| 东海县| 大新县| 乌兰县| 剑河县| 仙桃市| 资中县| 鹤岗市| 舞钢市| 福泉市| 东兴市| 南川市| 永和县| 偏关县| 汽车| 延安市| 巴塘县| 商都县| 沈丘县| 长丰县| 柳林县| 平江县| 张掖市| 宜丰县| 石屏县| 体育| 鄂伦春自治旗| 周口市| 秀山| 喀喇| 甘南县| 贵定县| 靖远县| 烟台市| 吉木萨尔县| 阳谷县| 治多县| 昌平区| 常熟市| 枣强县|