场景一: 
某日被问,视图可以被更新吗?什么情况下可以被更新? 

说明: 
所谓视图的更新,包括增删改3中修改操作; 

解答: 
聪明人一般会做肯定回答,可惜我当时傻帽了一下。可更新的视图必须足够简单,视图的每条数据都能追溯到原表的数据: 
1、不包含distinct 
2、from源表单一 
3、where不能包含子查询 
4、查询不能包含group by 或having子句 
5、选择列表不能包含表达式、计算字段或字段函数 

不过有些DBMS要求比较松,DB2允许对包含计算的视图执行delete操作,并允许对计算字段以外的字段进行更新。


曾做到oracle转db2,由于转换过程中,更新的触发器未创建成功而遗漏;当更新视图试就报错

Caused by: com.ibm.db2.jcc.am.ro: DB2 SQL Error: SQLCODE=-150, SQLSTATE=42807, SQLERRMC=null, DRIVER=3.58.82

http://www.cppblog.com/prayer/archive/2009/06/03/86679.html

经以上网址查询为触发器原因,因此可反推,5条件时(含有字段函数时)都不可以.因此与其说能更新,还不如说是不能更新.

因为在日常业务场景中,一般是不会写如此简单的视图,所以说,就不可以!


来了份更全的..

---------------------------------------------------------

是否所有的视图都可以更新?为什么?

不是所有的视图都可以更新,视图更新必须遵循以下规则:
      不是所有的视图都可以更新,视图更新必须遵循以下规则:
      (1)若视图的字段是来自字段表达式或常数,则不允许对此视图执行INSERT、UPDATE操作,允许执行DELETE操作;
      (2)若视图的字段是来自库函数,则此视图不允许更新;
      (3)若视图的定义中有GROUP BY子句或聚集函数时,则此视图不允许更新;
      (4)若视图的定义中有DISTINCT任选项,则此视图不允许更新;
      (5)若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该视图的基表,则此视图不允许更新;
      (6)若视图是由两个以上的基表导出的,此视图不允许更新;
      (7)一个不允许更新的视图上定义的视图也不允许更新;
      (8)由一个基表定义的视图,只含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新。