3.5.4 更新视图
更新视图是指通过视图来插入、删除和修改数据。和查询视图一样,由于视图是不实际存储数据的虚表,因此对视图的更新也是通过视图消解,最终要转换为对基本表的更新。
为防止用户通过视图对数据进行插入、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句,这样在视图上插入、修改、删除数据时,系统会检查视图定义中的条件,若不满足条件则拒绝执行该操作。
【例3.71】 利用例3.65中创建的计算机学院学生视图Jsj_Student,修改学号为“201818101”的出生日期,将其修改为“2001-10-10”。
UPDATE Jsj_Student
SET Sbirthday=2001-10-10
WHERE Sno=201818101;
该语句执行时将转换成对Student表的修改:
UPDATE Student
SET Sbirthday=2001-10-10
WHERE Sdept=计算机AND Sno=201818101;
【例3.72】 利用例3.65中创建的计算机学院学生视图Jsj_Student,插入一个新的学生记录,学号:“201818108”,姓名:“赵鑫”,学院:“计算机”。
INSERT INTO Jsj_Student(Sno,Sname,Sdept)
VALUES(201818108,赵鑫,计算机);
注意:例3.65视图定义中WHERE子句中的条件表达式为:Sdept=计算机,如果插入的记录没有给定Sdept属性值,或是给定的Sdept属性值不等于“计算机”,SQL Server将不允许插入记录,并将给出如下出错信息:
【例3.73】 删除计算机学院学生视图Jsj_Student中学号为“201818108”的记录。
DELETE FROM Jsj_Student
WHERE Sno=201818108;
该语句执行时将转换成对Student表的删除:
DELETE FROM Student
WHERE Sdept=计算机AND Sno=201818108;
注意:并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。例如,希望把例3.68定义的Cno_NoPass视图中课程号为“C001”的不及格课程数量更改为0,但这个对视图的更新无法转换成对基本表SC的更新,因为系统无法修改各科成绩,以使 课程“C001”的不及格数量为0,所以Cno_NoPass视图是不可更新的。