视图能否被更新

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

说明: 
所谓视图的更新,包括增删改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)由一个基表定义的视图,只含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值