设为首页 收藏本站
查看: 604|回复: 0

[经验分享] 在Oracle的连接视图上进行数据更新操作

[复制链接]

尚未签到

发表于 2018-9-13 13:35:06 | 显示全部楼层 |阅读模式
  数据库视图是表的一个延伸对象。从理论上来说,在视图上使用DML语句对数据进行更新,最终都会在基础表上完成。也就是说,可以通过视图对基础表的内容进行修改 。但是,往往没有这么简单。若想在连接视图上执行DML修改语句的话,需要严格的遵守一些限制。否则的话,DML语句不会执行成功。
  假设现在人事管理系统中有三个表,一个是员工基本信息表,包含员工编号(非空)、员工姓名(非空)、身份证号码等字段;第二个表是企业部门职位表包含职位编号(非空 )、职位名称(非空)、职位描述等字段;第三个是员工与部门职位对应表,包含员工编号(非空)、职位编号(非空)、描述等字段。
  现在数据库管理员做了一张视图,查询员工编号、员工姓名、部门信息。此时,这张连接视图可以用DML语句来进行更新呢?这就要看其是否满足一定的条件。
  条件一:在连接视图中不能有Order by排序语句。
  若用户想要在上面这张视图中,更改员工所属的部门,则首先要考虑,在生成视图的查询语句中,是否使用了Order by排序语句。若有这个排序语句的话,则在视图上进 行DML操作,是不会成功的。
  这主要是因为采用了Order by排序语句后,记录的物理存储顺序发生了改变。此时,若在视图上进行了数据更新,则其对应的基础表找不到具体更改的物理位置。所以, 会以失败告终。
  所以,用户若想在上面这个视图界面对员工所属的部门进行更改的话,则一定不能够在SQL语句中加入Order by等排序语句。类似的,也不能够在SQL语句中含有Group by 、connetc by等语句。若有这些语句的话,则数据库都不允许对数据进行数据更新操作。
  条件二:基础表中所有的NOT NULL列都必须在这个视图中。
  若想在视图上进行数据更新操作的话,则必须要求对应基础表中的所有不允许空的字段都在当前的视图中。其实这很好理解,若每个字段不允许为空,则又不在当前的视 图中,则新增加记录的时候,这个字段就没有被赋值,故在保存时就会被基础表所拒绝。
  在上面这个例子中,数据库管理员若建立的视图没有包含所有的非空字段。如企业部门职位表总的职位编号就没有在这个视图中。所以,数据库不会接纳这张视图上的更 新。若用户确实需要在这张视图上更新数据,则就要考虑把所有的非空字段显示在这张视图上。
  另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新数据 。那难道也要求在视图中包含所有的非空字段呢?答案是肯定的。因为数据库系统在提交更新事务之前就会对这个条件进行判断。
  条件三:需要更新的列不是虚拟列。
  在视图中,可能有些列的结果是通过列表达式定义的,在基础表中并不存在。我们把这些列叫做虚拟列。如在上面的员工信息表中,并没有员工的出生年月信息。而在视 图中,我们可以通过身份证号码来取得某个员工的出生日期。此时若想在视图中更改这个出生日期,则很明显是不行的。因为基础表中根本没有这个字段,那更改的结果 就无法保存。
  只要在视图中有虚拟列的存在,只要视图中任何一列是由列表达式定义的,那么对不起,整张视图都不能够进行更改。这个控制原理跟上面这个条件是类似的。
  可见,在数据库设计的时候,就需要考虑是否需要在视图基础上对表的内容进行更改。若需要更改的话,则一定不能够在视图中采用虚拟列,而宁愿在表中多增加一些字 段。或者在数据库视图中不采用虚拟列,而是在前台应用程序中采用虚拟列。
  条件四:不能够具有分组函数。
  如上面这张员工与职位的对应关系表中,用户不但想知道某个职位现有的员工有哪些;还希望知道,某个职位现在员工的具体人数。要实现这个需求的话,则数据库管理 员就需要在视图中采用分组函数,来统计某个职位的具体人数。
  但是,若视图中有这个函数的话,则也不能够对这张视图进行更新。这是Oracle数据库的强制规定。
  其实,这也可以通过一些灵活的方式来避免。如在数据库视图中不需要采用分组函数。而是在前台的Select语句中,查用分组函数。因为前台要调用数据库中的数据,仍 然需要查用Select语句去查询视图。所以,即使在原始的数据库视图中不对数据进行分组,则在前台应用程序中仍然可以帮助用户完成数据分组与统计的任务。此时,用 户若在视图中更改数据的话,不仅可以更新数据库基础表中的内容;而且,还可以及时的反馈到前台的应用程序界面中。
  分组函数会增加数据库查询的负担;同时,使得无法在视图上采取DML操作。故数据库管理人员需要跟前台应用程序开发人员进行协商,在前台实现对数据的分组统计,而 不是在后台。
  除了以上几个限制条件之外,若需要在视图上进行DML操作的话,则在建立视图的Select语句中,还不能够有集合运算符、子查询等等。以上这些是一些必须要满足的基 本条件,缺一不可。否则的话,针对视图的DML操作,就会以失败告终。
  但是,并不是说符合了上面这个几个条件后,视图就可以畅所无阻的进行数据更新了,其仍然必须符合一定的规则。这其中,最重要的就是键值保存表规则。
  如果连接视图中的一个基础表的键在他的视图中仍然存在,并且在连接视图中仍然是主键,则这个基础表就为键值保存表。在连接视图上,对视图进行插入、删除、更新 等操作时,一次只能够对视图中的一个键值保存表进行更新。
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-578183-1-1.html 上篇帖子: Oracle中视图的创建和处理方法 下篇帖子: Oracle数据库日常维护知识总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表