Oracle 原理: 视图,对视图进行增删改操作
Oracle的視圖和SQLServer的視圖基本一樣。??
視圖,是一個虛擬的表,不會給視圖分配存儲空間。視圖的建立需要依賴于單個或多個普通表,被依賴的普通表就成為"基表"。可以就像 用 select 語句類似,在某些表中選取字段和篩選條件,可以查詢出數據,把這數據構成一張虛擬的表,這就叫視圖。
? 視圖隱藏了數據的復雜性,還可以方便用戶的查詢,另外,還可以隔離物理表結構改變。視圖通常是用來查詢的,也可以對視圖進行增刪改。但是在視圖上進行增刪改要滿足一些前提: 單表視圖可以進行增刪改操作;在多表視圖中,只能對 鍵保留表進行刪改操作;或者 定義觸發器,替換掉增刪改語句。對視圖進行新增、刪除、修改視圖的數據是會把關聯的基表數據給改變的。
視圖創建語句如下,也可以在視圖上創建視圖
CREATE[OR REPLACE] VIEW [viewName] ASselect 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 asselect s.sno,s.sname,s.deptno dept1,d.deptno dept2,d.deptname from STUDENT s,DEPARTMENT dwhere s.deptno=d.deptnocommit; ------建立單表視圖---- CREATE VIEW VW_STU1 asselect s.sno,s.sname,s.deptno from STUDENT swhere deptno='001'; ------建立單表視圖---- CREATE VIEW VW_STU2 asselect s.sno,s.sname,s.deptno from STUDENT swhere 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? [視圖名];?
總結
以上是生活随笔為你收集整理的Oracle 原理: 视图,对视图进行增删改操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 原理:序列
- 下一篇: Oracle 的原理: 索引