视图是由一个或多个基本表(或视图)导出的表,它可以是连接多张表的虚表,也可以是通过where子句限制返回行列之后的查询结果。在使用敏感数据的企业中,视图几乎是唯一可以用来面对普通用户的数据库对象。
利用数据库视图进行更新实质上就是对数据库的基本表进行更新。所以视图的更新update命令有很多限制。
1,如果更新视图的字段来自字段表达式或者是常数,则不允许对视图进行Insert、update操作(但可以进行delete操作)。因为,假设用字段表达式或者是常数对视图进行了更新,那么视图的相关行或列就与基本表中的相关行或列不一致,或者在基本表中根本找不到,对视图的更新实质上是对基本表的更新,因此和基本表的不一致的视图是毫无意义的。(不允许Insert操作也是同样的道理)
2,如果更新字段来自库函数,则不允许对视图进行Insert、update操作(但可以进行delete操作)。举个例,如果当前视图只是某个基本表中的一部分,而现在要用sum函数对视图进行更新,那么sum就会将基本表中满足条件的值都相加,而其实视图中只包含满足条件的一部分,这样就会出现错误。
3,更新字段包含group by,distinct等函数,这跟2的解释是一样的。
4,若视图来自两个及以上的基本表,则不允许更新。这是因为如果要更新这样的视图,那么就会涉及到多个基本表的同时修改,这会导致数据库的存取非常复杂,因此,在现有的关系数据库系统中,只支持来自单个表的视图的更新。
5,在一个不允许更新的视图上定义的视图不允许更新。
【摘取自:利用视图更新数据库的探讨。郭小燕,张明】
摘自: