分享

12.3 通过视图更新表 - 《精通SQL——结构化查询语言详解》 - 免费试读 - bo...

 昵称310935 2009-09-17

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表中,删除的也是一整列的信息。

*说明

对视图使用DELETE语句可以删除底层表中的数据,这一点与第4章介绍的使用DROP VIEW语句删除视图是不同的。使用DROP VIEW语句删除视图后,只会删除该视图在数据字典中的定义,而与该视图有关的基本表中的数据不会受任何影响,而DELETE语句则将底层表中的相应的数据行也删除了。这一点在实际应用中要特别小心。

至此,由第4章、第11章以及本节的介绍,视图的基本概念、操作、用途就介绍完了。从中可以发现,由于视图中的数据不是存放在视图中的,即视图没有相应的存储空间,对视图的一切操作最终都要转换成对基本表的操作,这样看来使操作更加复杂,那么为什么还要使用视图呢?使用视图有如下几个主要的优点。

*     利于数据保密,可以为不同的用户定义不同的视图,使用户只能看到与自己有关的数据。例如,对TEACHER表创建了View_Teacher视图,可以设定用户只能修改男教师的特定的几列信息,而无法更改别的数据,从而保证了数据的安全性。

*     简化查询操作,为复杂的查询建立一个视图,用户不必键入复杂的查询语句,只需针对此视图做简单的查询即可。这一点在第4章中有过详细介绍。

*     保证数据的逻辑独立性。对于视图的操作,比如查询,只依赖于视图的定义。当构成视图的基本表要修改时,只需修改视图定义中的子查询部分,而基于视图的查询不用改变。


 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多