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  [视图名]; 

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/104562588