Oracle 原理: 視圖,對視圖進行增刪改操作

Oracle的視圖和SQLServer的視圖基本一樣。  

視圖,是一個虛擬的表,不會給視圖分配存儲空間。視圖的建立需要依賴於單個或多個普通表,被依賴的普通表就成爲"基表"。可以就像 用 select 語句類似,在某些表中選取字段和篩選條件,可以查詢出數據,把這數據構成一張虛擬的表,這就叫視圖。

  視圖隱藏了數據的複雜性,還可以方便用戶的查詢,另外,還可以隔離物理表結構改變。視圖通常是用來查詢的,也可以對視圖進行增刪改。但是在視圖上進行增刪改要滿足一些前提: 單表視圖可以進行增刪改操作;在多表視圖中,只能對 鍵保留表進行刪改操作;或者 定義觸發器,替換掉增刪改語句。對視圖進行新增、刪除、修改視圖的數據是會把關聯的基表數據給改變的。

視圖創建語句如下,也可以在視圖上創建視圖

CREATE[OR REPLACE] VIEW  [viewName]
AS
 select s.sno,s.sname,s.deptno 
        from STUDENT s
[WITH CHECK OPTION]
[WITH Read ONLY];

例如 創建了帶主鍵的表DEPARTMENT、STUDENT 一個多表視圖VW_STU_DEPT   兩個單表視圖

---建立表---
CREATE TABLE DEPARTMENT(
DEPTNO CHAR(3) PRIMARY KEY,
DEPTNAME VARCHAR2(20)
);
INSERT INTO DEPARTMENT VALUES('001','中文系');
INSERT INTO DEPARTMENT VALUES('002','數學系');
INSERT INTO DEPARTMENT VALUES('003','英語系');
---建立表---
CREATE TABLE STUDENT(
 SNO NUMBER (6) PRIMARY KEY,
 SNAME VARCHAR2(10),
 DEPTNO CHAR(3),
 CONSTRAINT dep_DEPARTMENT FOREIGN KEY (DEPTNO) REFERENCES DEPARTMENT(DEPTNO)
);
INSERT INTO STUDENT VALUES(1,'張三','001');
INSERT INTO STUDENT VALUES(2,'李四','001');
INSERT INTO STUDENT VALUES(3,'王五','002');
----建立多表視圖----
CREATE VIEW  VW_STU_DEPT
as
 select s.sno,s.sname,s.deptno dept1,
        d.deptno dept2,d.deptname from STUDENT s,DEPARTMENT d
 where s.deptno=d.deptno
 commit;
------建立單表視圖----
CREATE VIEW  VW_STU1
as
 select s.sno,s.sname,s.deptno 
        from STUDENT s
        where deptno='001';
------建立單表視圖----
CREATE   VIEW  VW_STU2
as
 select s.sno,s.sname,s.deptno 
        from STUDENT s
        where deptno='001'
WITH CHECK OPTION;

視圖是一個虛擬表,查詢視圖的方法和查詢表是一樣的。單表視圖是可以進行修改的:

我們可以看見,單表視圖 VW_STU1 被成功修改,修改完後數據少一行的原因就是這個視圖的篩選條件只有STUDENT表上的 字段depno值要爲 '001'  纔會被納入視圖 VW_STU1 。

我們Rollback 後,再對VW_STU2 視圖進行相同的SQL操作

發現程序報錯的原因就在於 VW_STU2,加了 WITH CHECK OPTION 條件,這個條件禁止了把視圖數據減少的修改語句,但是增改操作還是可以的。 如果把視圖設爲只讀,在創建視圖的時候設定 WITH READ ONLY 就行,這樣就無法對視圖進行增刪改操作。

 

鍵保留表就是在定義視圖的時候,能夠在視圖上保留主鍵的基表

很明顯,對於視圖VW_STU_DEPT 中 保留了STUDENT基表上的主鍵,那麼STUDENT就是 鍵保留表,視圖只能對鍵保留表進行修改操作,不能對非鍵保留表進行修改操作,新增刪除依舊是可以的。

無法對多表視圖進行新增操作

但是可以對多表視圖進行刪除操作:

同時會影響到鍵保留表數據,但是不會影響到非鍵保留表數據

總而言之,在單表視圖中可以進行增刪查改操作,在多表視圖中只能對鍵保留表進行 刪查改 操作,無法修改普通表的。換言之,如果視圖沒有關聯的表裏面沒有主鍵,那麼就肯定無法進行增刪改操作。

刪除視圖:

DROP VIEW  [視圖名]; 

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