MySQL-视图
目录
介绍
基本操作语法
创建视图
查看视图创建语句
查看视图数据
修改视图
删除视图
检查选项
with cascaded check option
with local check option
更新及作用
更新的条件
更新的作用
简单
安全
数据独立
介绍
视图是一种虚拟的表,在数据库中并不真实存在。更简单地说,就是视图并不储存数据,只是纪录了数据的逻辑。
基本操作语法
创建视图
create or replace view name_gen as select user_name,user_gender from users where user_id <=10;
查看视图创建语句
show create view name_gen;
查看视图数据
select *from name_gen;
修改视图
create or replace view name_gen as select user_name,user_gender,uesr_num from users where user_id <=10;
alter view name_gen as select id,name from user where id<=10;
可以添加新的字段,或删除字段。
删除视图
drop view if exist name_gen;
不难发现,视图是一种特殊的表,所以可以想使用表一样来操作视图。
检查选项
我们开始说过,视图当中是不存数据的,试图展示的只是数据间的逻辑关系。
那么大家思考一下,如果我想对表一样,针对视图进行插入操作,还会不会有数据的变化呢?
答案是会变化的,但是变化的本质不是视图,而是视图表示的那张真实存在的数据表,我们将其称为基表。
简单来说,针对视图进行的插入操作,最后会直接作用于基表,此时不管进行表的查询还是视图的查询都会发现数据的修改。
那么对使视图的插入操作会影响到数据表,就会带来一系列的问题,比如:
我创建了一个有十条数据的视图(字段为id和name),,假设基表有5条数据:
create or replace view id_name as select user_id,user_name from users where user_id <=10;
然后针对视图进行插入数据的操作:
insert into name_gen values(8,"小昭");
此时我们知道,基表已经多了一条数据,而我们再进行视图或者基表的查询时,能够看见数据的变化。
那么再次插入一条数据:
insert into name_gen values(12,"光头强");
我们先查看基表,数据变确实变化了。但是我们进行视图视图查询时,发现视图并没有变化!!!
我们回顾一下视图的创建语句,我们使用了约束函数where,约束了id的范围,这就一定程度破坏数据的一致性。
而解决这个问题可以在视图创建时加上检查选项:
create or replace view id_name as select user_id,user_name from users where user_id <=10
with cascaded check option;
--with local check option
介绍
在使用 with local check option 时,MySQL会检查视图的每一个正在更新的行,并确保它符合视图的创建条件。MySQL允许基于一个视图创建另一个视图,为了规定检查的范围,mysql提供了两个选项:
-
with cascaded check option
cascaded就是,当某一个视图是建立在另一个视图上创建的,就会对该视图以及所关联的视图进行检查,必须要都满足,才能进行合法操作。
这里要非常注意的是,虽然即使在创建视图时使用了约束函数where,但是如果没有指定检查选项时,在更新视图时不会去判断where中的条件。
-
with local check option
与cascaded的区别在于,local只会为当前语句创建检查选项,并不会为关联的表创建检查选项。
更新及作用
更新的条件
视图中的行必须与基础表中的行一一对应关系。
视图包含下面任何一项则不可更新:
- 聚合函数
- DISTINCT
- group by
- having
- UNION、UNION ALL
更新的作用
-
简单
视图可以简化数据的操作,如果一项查询被经常使用,就可以将其写成视图,就不用每次查询的时候都去指定一系列条件。
-
安全
虽然数据库可以进行授权操作,但是并不能具体到数据表的行和列上。而通过视图,用户只能修改视图中的可见数据。
-
数据独立
能够消除底层基表变化带来的影响(用户不需要关心视图背后的实际数据来源)