zoukankan      html  css  js  c++  java
  • 【Oracle11g】14_视图

    1.视图相关的概念

    • 视图以经过定制的方式显示来自一个或多个表的数据
    • 视图可以视为“虚拟表”或“存储的查询”
    • 创建视图所依据的表称为“基表”

    2.视图的优点

    • 提供了另外一种级别的表安全性
    • 隐藏的数据的复杂性
    • 简化的用户的SQL命令
    • 隔离基表结构的改变
    • 通过重命名列,从另一个角度提供数据

    3.创建视图的语法

    CREATE [OR REPLACE] [FORCE] VIEW
        view_name [(alias[, alias]...)] 
      AS select_statement
      [WITH CHECK OPTION]
      [WITH READ ONLY];
    

    force:强制创建视图,不管有没有表都强制创建,当创建了表后,强制创建后便可使用。
    在with check option的选项下,可以总结为:

    • update,要保证数据update之后能被视图查询出来,也就是要符合where的条件
    • insert,保证insert的数据能被视图查询出来
    • delete,有无 with check option都一样
    • 对于没有where字句的视图,使用with check option是多余的

    with read only :不能进行任何更新、插入、删除等操作,只能查询。

    3.1 with check option案例演示

    -- 没有使用with check option选项
    create table e_bak as select * from emp;
    
    create view view3 as select * from e_bak where empno='7369';
    
    update view3 set empno='9999' where empno='7369';
    
    -- 查询记录
    select * from e_bak; -- 查询发现empno为7369的记录已经被修改
    
    -- 查询视图
    select * from view3; -- 查询结果无数据
    

    在上述这种情况下,视图view3也就相当于失效了,是一个没有任何意义的视图。那么在Oracle引入了with check option来进行更新限制

    -- 使用with check option选项
    create view view4 as select * from e_bak where empno='9999' with check option;
    
    update view4 set empno='8888' where empno='9999';
    -- 执行报错:ORA-01402: 视图 WITH CHECK OPTION where 子句违规
    
    

    4.视图的修改

    在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE
    视图上的DML语句有如下限制:

    • 只能修改一个底层的基表
    • 如果修改违反了基表的约束条件,则无法更新视图
    • 如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
    • 如果视图包含伪列或表达式,则将无法更新视图

    4.1 键保留表可以更新,非键保留表则不可更新

    案例说明

    create table student_info(stu_no number primary key,stu_name varchar2(40),cls_no number);
    create table class(cls_no number primary key,cls_name varchar2(40));
    
    -- 插入数据
    insert into student_info values(1,'张三',10);
    insert into student_info values(2,'李四',30);
    insert into student_info values(3,'王五',30);
    insert into student_info values(4,'周六',20);
    
    insert into class values(10,'统计1101');
    insert into class values(20,'信计1101');
    insert into class values(30,'物理1101');
    insert into class values(40,'软件1101');
    commit;
    -- 创建视图
    create view stu_cls as select 
    s.stu_no,
    s.stu_name,
    s.cls_no,
    c.cls_no as class_no,
    c.cls_name
    from student_info s,class c where s.cls_no=c.cls_no;
    
    -- 现在student是主键保留表,cls是非主键保留表
    --	更新student
    update stu_cls set stu_no='11' where stu_no=1;
    update stu_cls set stu_name='Jack' where stu_no=2;
    update stu_cls set cls_no='40' where stu_no=3;
    
    --	更新class
    update stu_cls set cls_name='交通运输1101' where cls_no='20'
    -- 报错:ORA-01779: 无法修改与非键值保存表对应的列
    
    

    5.删除视图

    DROP VIEW view_name; 
    
  • 相关阅读:
    (14)python函数与变量
    ①③python中的字符串与字符编码
    ①②python文件操作及文件增删改查
    rsa公钥私钥
    MySQL创建数据库和表
    Rsync + Innotify 部署实例
    LNMPT部署示例
    Nginx 调优
    Nginx 二进制方式安装
    wget & curl 命令
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12679858.html
Copyright © 2011-2022 走看看