四. 修改视图
修改已经存在的视图,有两种方式,一种是 create or replace, 另外一种是用 alter .
四.一 create or replace 重新创建视图
修改视图,用的是 or replace ,会重新创建一个新的视图。
如 修改 视图 v_user1, 改变 查询 name 和 age 的视图。 不能改变视图名称,只改变查询结果。
create or replace view v_user1(name,age) as (select name,age from user) ;
查询一下数据:
select * from v_user1;
会发现,视图 v_user1 被修改了。
注意,此时如果视图名称不存在,那么将会创建一个新视图。
四.二 alter view view_name 重新创建视图
修改视图,而不是 存在时修改,不存在时创建,那么可以直接使用 alter 进行修改
如 修改 v_user2 ,让其只查询 id 和 name 两个列。
alter view v_user2 (id,name) as (select id,name from user);
将 create or replace 替换成 alter .
重新查询 v_user2 的话:
select * from v_user2;
问题1: 如果 alter 修改的是一个不存在的视图, 如 v_user100 时,会出现什么情况呢?
alter view v_user100 (id,name) as (select id,name from user);
ERROR 1146 (42S02): Table ‘yuejl.v_user100’ doesn’t exist
会报错,提示视图不存在。
五. 使用/更新 视图
视图是一个虚拟表,没有存储数据,所以对视图数据的更新,实际上都转移到对基本表的更新上了。但是,不建议对视图进行更新操作, 只提倡查询。
五.一 查询数据
如 查询视图 v_user2
select * from v_user2;
v_user2 里面,有两个字段, id 和 name.
五.二 插入数据
当前, user 表 还是9条数据, 没有发生改变。
select * from user;
往视图 v_user2 里面插入一条数据, id 是10, 名称为 新员工5.
insert into v_user2(id,name) values(10,'新员工5');
这个时候,重新查看一下 v_user2 视图数据
select * from v_user2;
查看一下基本表 user中的数据
select * from user;
可以看出,正常的插入到视图(准确说是基本表)里面了.
五.三 更新数据
如将 视图 v_user2 里面的 id=10 新插入的那个数据 的员工名称 改变 ‘我是新来的员工5’
update v_user2 set name='我是新来的员工5' where id=10;
查看一下基本表 user 中的数据
select * from user;
五.四 删除数据
如将 视图 v_user2 里面的那条 id=10 的数据删除。
delete from v_user2 where id=10;
再重新查询一下 user 表的数据
select * from user;
五.五 约束性视图
在实际开发生活中,是不允许你通过更新视图进行改变基本表的数据, 所以常常会增加一些限制。
如 创建一个新视图 v_user3, 里面有 id 和 name 两个字段,但是有限制。
create or replace view v_user3 (id,name) as (select id,name from user where id<20) with check option;
从表里面查询出来的数据,必须要保证 id<20.
那么,此时 查询一下视图:
select * from v_user3;
如果此时,往视图里面 添加 一条 id=100 的新数据(100>20)
insert into v_user3 (id,name) values(100,'新约束员工');
ERROR 1369 (HY000): CHECK OPTION failed ‘yuejl.v_user3’
会发现,不能插入进去 。
如果此时,往视图里面添加 一条 id=11 的新数据 (11<20)
insert into v_user3 (id,name) values(11,'新约束员工');
可以正确地插入
重新查询一下数据:
select * from user;
添加 with check option 之后,维护后的数据不能确定视图的完整性。
六. 删除视图
命令:
drop [if exists] view view_name;
如删除 视图 v_user3
drop view v_user3;
再次查询视图 v_user3的话:
select * from v_user3;
如果删除一个不存在的视图, 那么也会报错的。
删除视图,支持同时删除多个视图, 如再删除 v_user1和 v_user2
drop view v_user1,v_user2;
视图是非常重要的,老蝴蝶建议一定要掌握其常见用法。