视图的更新

伟大的某某某就曾说过:“实践出真知”
在我的MySQL练习中,就出现了让我困惑的一幕。

-- 视图的创建
create view V_S as select * from student;

-- 修改视图所代替的查询语句
alter view V_S as 
select student.s_id,student.s_name,class.c_name
	from student left join class on student.s_cid = class.c_id
union
select student.s_id,student.s_name,class.c_name
	from student right join class on student.s_cid = class.c_id;

更新视图,在视图中修改原表数据。

update V_S set s_sex = '女' where s_name = '陈小皮';

这里出现了报错
在这里插入图片描述
经过查询相关资料,总结出以下几点:
(1)若视图的字段是来自字段表达式或常数,则不允许对此视图执行INSERT、UPDATE操作,允许执行DELETE操作;
(2)若视图的字段是来自库函数,则此视图不允许更新;
(3)若视图的定义中有GROUP BY子句或聚集函数时,则此视图不允许更新;
(4)若视图的定义中有DISTINCT任选项,则此视图不允许更新;
(5)若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该视图的基表,则此视图不允许更新;
(6)若视图是由两个以上的基表导出的,此视图不允许更新;
(7)一个不允许更新的视图上定义的视图也不允许更新;
(8)由一个基表定义的视图,只含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新。
(9)建立在可更新视图基础上的视图,不一定可以更新
(10)含有order by 的视图定义的视图可以更新

下面举个小示例,验证一下是否真的能更新。
-- 新建一个视图
create view view_stu as select * from student;
update view_stu set s_sex = '女' where s_name = '陈小皮';
select * from view_stu;
select * from student;

视图的更新_第1张图片
可以看到无论是查询试图还是查询原表,其中的数据都有了修改。

重新建立对基础知识的理解
什么是基本表?什么是视图?:基本表是本身独立存在的表,在SQL中一个关系对应一个表。视图是从一个或几个基本表导出的表,本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。

所有视图是否都可以更新?:不是,视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。因为有些视图的更新不能唯一有意义地转换相应基本表的更新,所以,并不是所有的视图都可以更新的。

你可能感兴趣的:(MySQL,数据库,mysql,sql)