WEB开发网
开发学院数据库Oracle 在Oracle的连接视图上进行数据更新操作 阅读

在Oracle的连接视图上进行数据更新操作

 2008-12-06 13:02:04 来源:WEB开发网   
核心提示: 在上面这个例子中,数据库管理员若建立的视图没有包含所有的非空字段,在Oracle的连接视图上进行数据更新操作(2),如企业部门职位表总的职位编号就没有在这个视图中,所以,在连接视图上,对视图进行插入、删除、更新等操作时,数据库不会接纳这张视图上的更新,若用户确实需要在这张视图上更新数据

在上面这个例子中,数据库管理员若建立的视图没有包含所有的非空字段。如企业部门职位表总的职位编号就没有在这个视图中。所以,数据库不会接纳这张视图上的更新。若用户确实需要在这张视图上更新数据,则就要考虑把所有的非空字段显示在这张视图上。

另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新数据。那难道也要求在视图中包含所有的非空字段呢?答案是肯定的。因为数据库系统在提交更新事务之前就会对这个条件进行判断。

条件三:需要更新的列不是虚拟列。

在视图中,可能有些列的结果是通过列表达式定义的,在基础表中并不存在。我们把这些列叫做虚拟列。如在上面的员工信息表中,并没有员工的出生年月信息。而在视图中,我们可以通过身份证号码来取得某个员工的出生日期。此时若想在视图中更改这个出生日期,则很明显是不行的。因为基础表中根本没有这个字段,那更改的结果就无法保存。

只要在视图中有虚拟列的存在,只要视图中任何一列是由列表达式定义的,那么对不起,整张视图都不能够进行更改。这个控制原理跟上面这个条件是类似的。

可见,在数据库设计的时候,就需要考虑是否需要在视图基础上对表的内容进行更改。若需要更改的话,则一定不能够在视图中采用虚拟列,而宁愿在表中多增加一些字段。或者在数据库视图中不采用虚拟列,而是在前台应用程序中采用虚拟列。

条件四:不能够具有分组函数。

如上面这张员工与职位的对应关系表中,用户不但想知道某个职位现有的员工有哪些;还希望知道,某个职位现在员工的具体人数。要实现这个需求的话,则数据库管理员就需要在视图中采用分组函数,来统计某个职位的具体人数。

但是,若视图中有这个函数的话,则也不能够对这张视图进行更新。这是Oracle数据库的强制规定。

其实,这也可以通过一些灵活的方式来避免。如在数据库视图中不需要采用分组函数。而是在前台的Select语句中,查用分组函数。因为前台要调用数据库中的数据,仍然需要查用Select语句去查询视图。所以,即使在原始的数据库视图中不对数据进行分组,则在前台应用程序中仍然可以帮助用户完成数据分组与统计的任务。此时,用户若在视图中更改数据的话,不仅可以更新数据库基础表中的内容;而且,还可以及时的反馈到前台的应用程序界面中。

分组函数会增加数据库查询的负担;同时,使得无法在视图上采取DML操作。故数据库管理人员需要跟前台应用程序开发人员进行协商,在前台实现对数据的分组统计,而不是在后台。

除了以上几个限制条件之外,若需要在视图上进行DML操作的话,则在建立视图的Select语句中,还不能够有集合运算符、子查询等等。以上这些是一些必须要满足的基本条件,缺一不可。否则的话,针对视图的DML操作,就会以失败告终。

但是,并不是说符合了上面这个几个条件后,视图就可以畅所无阻的进行数据更新了,其仍然必须符合一定的规则。这其中,最重要的就是键值保存表规则。

如果连接视图中的一个基础表的键在他的视图中仍然存在,并且在连接视图中仍然是主键,则这个基础表就为键值保存表。在连接视图上,对视图进行插入、删除、更新等操作时,一次只能够对视图中的一个键值保存表进行更新。

上一页  1 2 

Tags:Oracle 连接 视图

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接