12.3 通过视图更新表由于视图是一张虚表,所以对视图的更新,最终实际上是转换成对视图的底层表的更新。因此,可以通过更新视图的方式实现对表中数据的更新。视图的更新操作包括插入、修改和删除数据,而通过视图向表中插入数据在上章已经介绍过了,这里主要讨论通过更新视图修改和删除表中的数据。 12.3.1 可更新视图的约束在本书第4章索引与视图的创建中已经介绍过,不是所有的视图都是可更新的。可更新的视图必须满足如下条件。 SELECT子句中的目标列不能包含聚集函数。 SELECT子句中不能使用DISTINCT关键字。 不能包括GROUP BY子句。 不能包括经算术表达式计算出来的列。 视图必须是基于单表的,即由单个基本表使用选择、投影操作导出,并且要包含了基本表的主码。 只有在创建视图时,满足了上面几点,才可以对视图进行更新,即对创建视图的基本表进行更新操作。 12.3.2 通过视图更新表数据可以像更新表一样,使用UPDATE语句更新视图。更新视图的语法如下。 UPDATE View_name SET column1=value1, column2=value2, …… WHERE search_condition 说明:与更新表相比,只是将表名替换为视图名,其他与更新表中数据的语法完全相同。当然视图必须满足可更新视图的条件。
在UPDATE语句中,使用视图代替底层表的两个好处是: 可以限制用户可更新的底层表中的列; 使列名具有更好的描述性。 比如,要求用户只能更新TEACHER表中的男教师的教工号、姓名、所在系、工资信息,而TEACHER表中的其他信息不能够被更新。这时候,就可以将TEACHER表中的相应信息创建视图View_Teacher,并授予可更新权限,而将TEACHER表的权限设置成不可更新的(有关权限的授予在第13章会有详细介绍)。SQL代码如下。 CREATE VIEW View_Teacher(Boy_NO, Boy_Name, Boy_Depart, Boy_Salary) AS SELECT TNO, TNAME, DNAME, SAL FROM TEACHER WHERE TSEX = '男' 查看视图的数据。 SELECT * FROM View_Teacher 运行结果如图12.14所示。 图12.14 视图View_Teacher中的记录 通过该视图就可以实现对TEACHER表中的男教师的教工号、姓名、所在系、工资信息的修改,而不能改变TEACHER表中的其他任何数据。 实例13 通过视图更新表数据 为工资低于1000元的男教师增加10%的工资,代码如下。 UPDATE View_Teacher SET Boy_Salary = Boy_Salary + Boy_Salary *0.1 WHERE Boy_Salary < 1000 查看更新后的View_Teacher视图中的数据,如图12.15所示。 图12.15 为工资低于1000元的男教师增加10%工资后的纪录 系统在执行此代码时,首先从数据字典中找到View_Teacher视图的定义,然后把此定义和更新数据操作结合起来,转换成等价的、对底层表TEACHER的数据更新操作。相当于对TEACHER表执行以下操作。 UPDATE TEACHER SET SAL = SAL + SAL *0.1 WHERE TSEX = '男' AND SAL < 1000 此时,查看TEACHER表中的数据: SELECT * FROM TEACHER 运行结果如图12.16所示。 图12.16 与图12.15等价的另一种表示 可见,所有相关数据已经得到更新。 12.3.3 通过视图删除表数据通过视图也可以从表中删除行。与UPDATE语句一样,如果想使用视图作为DELETE语句的目标表,该视图也必须要满足可更新条件。视图不必显示底层表中的所有列,但是视图的SELECT语句必须只引用单个表,即DELETE语句的目标表。 通过视图,使用DELETE语句删除表中数据的基本语法如下。 DELETE FROM View_name WHERE search_condition 说明:当使用视图作为DELETE语句的目标表时,只能删除那些在视图的SELECT子句中满足搜索条件,即满足视图选择标准的那些行。假如通过上节创建的View_Teacher视图,删除TEACHER表中的数据,就只能删除那些TEACHER表中的TSEX值为“男”的那些行。 实例14 通过视图删除表数据 将工资低于1000元的男教师记录删除,代码如下。 DELETE FROM View_Teacher WHERE Boy_Salary < 1000 查看更新后的View_Teacher视图中的数据,如图12.17所示。 图12.17 删除工资低于1000元的男教师信息后的记录 系统在执行此代码时,首先从数据字典中找到View_Teacher视图的定义,然后把此定义和删除数据操作结合起来,转换成等价的、对底层表TEACHER的数据删除操作。相当于对TEACHER表执行以下操作。 DELETE FROM TEACHER WHERE TSEX = '男' AND SAL < 1000 此时,查看TEACHER表中的数据: SELECT * FROM TEACHER 运行结果如图12.18所示。 图12.18 更新TEACHER信息后的记录 可见,在底层表即TEACHER表中,删除的也是一整列的信息。
至此,由第4章、第11章以及本节的介绍,视图的基本概念、操作、用途就介绍完了。从中可以发现,由于视图中的数据不是存放在视图中的,即视图没有相应的存储空间,对视图的一切操作最终都要转换成对基本表的操作,这样看来使操作更加复杂,那么为什么还要使用视图呢?使用视图有如下几个主要的优点。 利于数据保密,可以为不同的用户定义不同的视图,使用户只能看到与自己有关的数据。例如,对TEACHER表创建了View_Teacher视图,可以设定用户只能修改男教师的特定的几列信息,而无法更改别的数据,从而保证了数据的安全性。 简化查询操作,为复杂的查询建立一个视图,用户不必键入复杂的查询语句,只需针对此视图做简单的查询即可。这一点在第4章中有过详细介绍。 保证数据的逻辑独立性。对于视图的操作,比如查询,只依赖于视图的定义。当构成视图的基本表要修改时,只需修改视图定义中的子查询部分,而基于视图的查询不用改变。 |
|
来自: 昵称310935 > 《oracle相关文档》