視圖可以update嗎,學會做個離經叛道者

Oracle裏視圖可以update嗎?

 

如果在網上做出這樣一個問題調查,我想很多的網友朋友,都會不假思索的回答到,不行,視圖是邏輯記錄,並不是物理記錄,而且很多的朋友

在影響深處都有這樣一個淺意識影響或者是經驗。

 

但是在這裏,我要告訴大家的是,視圖是可以update,不過,這是視圖不是一個普通視圖。

以下這樣的視圖是可以update

 

update的情況,必須是一下情況

 

1. view的字段只涉及一個表。


2. 如果涉及多個表的話,被(涉及到的)view列所映射table列(或列的組合)必須是有主健或者unique約束的


3. 強制執行,方法是加上hint /*+ BYPASS_UJVC */

 

我們做一下實驗,OS window xp profession, Oracle 10.2.0.1

 

SQL> CREATE TABLE test1 ( id integer primary key, num integer );
SQL> INSERT INTO test1 VALUES (1,0);
SQL> INSERT INTO test1 VALUES (2,0);

SQL> CREATE TABLE test2 ( id integer, num integer, upd integer );
SQL> INSERT INTO test2 VALUES (1,10, 0);
SQL> INSERT INTO test2 VALUES (2,20, 1);

SQL> UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;
ORA-01779: cannot modify a column which maps to a non key-preserved table

SQL> CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);
SQL> UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;
1 row updated.

SQL> UPDATE ( SELECT /*+ BYPASS_UJVC */ t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;

 

大家看到了,通過這裏的實驗,我們看到了,並不是所有的視圖都不能update的,有時我們的潛意識和經驗對於我們的學習很有幫助,不過

有時這樣的淺意思和經驗對我們的學習也有一些不好的影響,多思考,多懷疑,多驗證,是一個學習中的好習慣,很多的固化下來的思想,並不一定是正確的,紮實的學習,不放過學習中的疑問,學會做一個正確的離經叛道者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章