在Oracle的连接视图上进行数据更新操作
数据库视图是表的一个延伸对象。从理论上来说,在视图上使用DML语句对数据进行更新,最终都会在基础表上完成。也就是说,可以通过视图对基础表的内容进行修改。但是,往往没有这么简单。若想在连接视图上执行DML修改语句的话,需要严格的遵守一些限制。否则的话,DML语句不会执行成功。假设现在人事管理系统中有三个表,一个是员工基本信息表,包含员工编号非空、员工姓名非空、身份证号码等字段第二个表是企业部门职位表包含职位编号非空、职位名称非空、职位描述等字段第三个是员工与部门职位对应表,包含员工编号非空、职位编号非空、描述等字段。现在数据库管理员做了一张视图,查询员工编号、员工姓名、部门信息。此时,这张连接视图可以用DML语句来进行更新呢这就要看其是否满足一定的条件。条件一:在连接视图中不能有Orderby排序语句。若用户想要在上面这张视图中,更改员工所属的部门,则首先要考虑,在生成视图的查询语句中,是否使用了Orderby排序语句。若有这个排序语句的话,则在视图上进行DML操作,是不会成功的。这主要是因为采用了Orderby排序语句后,记录的物理存储顺序发生了改变。此时,若在视图上进行了数据更新,则其对应的基础表找不到具体更改的物理位置。所以,会以失败告终。所以,用户若想在上面这个视图界面对员工所属的部门进行更改的话,则一定不能够在SQL语句中加入Orderby等排序语句。类似的,也不能够在SQL语句中含有Groupby、co
etcby等语句。若有这些语句的话,则数据库都不允许对数据进行数据更新操作。条件二:基础表中所有的NOTNULL列都必须在这个视图中。若想在视图上进行数据更新操作的话,则必须要求对应基础表中的所有不允许空的字段都在当前的视图中。其实这很好理解,若每个字段不允许为空,则又不在当
f前的视图中,则新增加记录的时候,这个字段就没有被赋值,故在保存时就会被基础表所拒绝。在上面这个例子中,数据库管理员若建立的视图没有包含所有的非空字段。如企业部门职位表总的职位编号就没有在这个视图中。所以,数据库不会接纳这张视图上的更新。若用户确实需要在这张视图上更新数据,则就要考虑把所有的非空字段显示在这张视图上。另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新数据。那难道也要r