在Oracle的连接视图上进行数据更新操作
2008-12-06 13:02:04 来源:WEB开发网在上面这个例子中,数据库管理员若建立的视图没有包含所有的非空字段。如企业部门职位表总的职位编号就没有在这个视图中。所以,数据库不会接纳这张视图上的更新。若用户确实需要在这张视图上更新数据,则就要考虑把所有的非空字段显示在这张视图上。
另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新数据。那难道也要求在视图中包含所有的非空字段呢?答案是肯定的。因为数据库系统在提交更新事务之前就会对这个条件进行判断。
条件三:需要更新的列不是虚拟列。
在视图中,可能有些列的结果是通过列表达式定义的,在基础表中并不存在。我们把这些列叫做虚拟列。如在上面的员工信息表中,并没有员工的出生年月信息。而在视图中,我们可以通过身份证号码来取得某个员工的出生日期。此时若想在视图中更改这个出生日期,则很明显是不行的。因为基础表中根本没有这个字段,那更改的结果就无法保存。
只要在视图中有虚拟列的存在,只要视图中任何一列是由列表达式定义的,那么对不起,整张视图都不能够进行更改。这个控制原理跟上面这个条件是类似的。
可见,在数据库设计的时候,就需要考虑是否需要在视图基础上对表的内容进行更改。若需要更改的话,则一定不能够在视图中采用虚拟列,而宁愿在表中多增加一些字段。或者在数据库视图中不采用虚拟列,而是在前台应用程序中采用虚拟列。
条件四:不能够具有分组函数。
如上面这张员工与职位的对应关系表中,用户不但想知道某个职位现有的员工有哪些;还希望知道,某个职位现在员工的具体人数。要实现这个需求的话,则数据库管理员就需要在视图中采用分组函数,来统计某个职位的具体人数。
但是,若视图中有这个函数的话,则也不能够对这张视图进行更新。这是Oracle数据库的强制规定。
其实,这也可以通过一些灵活的方式来避免。如在数据库视图中不需要采用分组函数。而是在前台的Select语句中,查用分组函数。因为前台要调用数据库中的数据,仍然需要查用Select语句去查询视图。所以,即使在原始的数据库视图中不对数据进行分组,则在前台应用程序中仍然可以帮助用户完成数据分组与统计的任务。此时,用户若在视图中更改数据的话,不仅可以更新数据库基础表中的内容;而且,还可以及时的反馈到前台的应用程序界面中。
分组函数会增加数据库查询的负担;同时,使得无法在视图上采取DML操作。故数据库管理人员需要跟前台应用程序开发人员进行协商,在前台实现对数据的分组统计,而不是在后台。
除了以上几个限制条件之外,若需要在视图上进行DML操作的话,则在建立视图的Select语句中,还不能够有集合运算符、子查询等等。以上这些是一些必须要满足的基本条件,缺一不可。否则的话,针对视图的DML操作,就会以失败告终。
但是,并不是说符合了上面这个几个条件后,视图就可以畅所无阻的进行数据更新了,其仍然必须符合一定的规则。这其中,最重要的就是键值保存表规则。
如果连接视图中的一个基础表的键在他的视图中仍然存在,并且在连接视图中仍然是主键,则这个基础表就为键值保存表。在连接视图上,对视图进行插入、删除、更新等操作时,一次只能够对视图中的一个键值保存表进行更新。
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
- ››Oracle中查找重复记录
- ››oracle修改用户登录密码
- ››Oracle创建删除用户、角色、表空间、导入导出等命...
- ››Oracle中登陆时报ORA-28000: the account is lock...
- ››Oracle数据库在配置文件中更改最大连接数
- ››Oracle中在pl/sql developer修改表的两种方式
更多精彩
赞助商链接