alter view 视图名[(列名)] as select 语句 [with[ cascaded | local ] check option ]
mysql> alter view sts_v_1 as select id,name from student where id=5;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from sts_v_1;
---- -----------
| id | name |
---- -----------
| 5 | 韦一笑 |
---- -----------
1 row in set (0.00 sec)
视图的删除操作:
drop view 视图名 [,视图名称] 。。。
mysql> drop view sts_v_1;
Query OK, 0 rows affected (0.02 sec)
我们重新创建个视图,并往视图插入数据
mysql> create view sts_v_1 as select id,name,s_no from student where id<=13;
Query OK, 0 rows affected (0.04 sec)
mysql> insert into sts_v_1 values(9,'宋江','21113112'),(10,'刘浪','20225313'),(11,'章六','20215393');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
我们往视图里插入的数据没有找到,是因为视图并不存储数据它只是个逻辑表,数据都存放在它的基表student中。还有我们创建的视图加了条件 id<=13 ,当插入id大于13的数据时,通过视图也是查不出来的。为了避免这种现象MySQL提供了在创建视图时尾部加上with cascaded check option 选项。
create or replace view sts_v_1 as select id,name,s_no from student where id<=13 with cascaded check option;
插入id大于13的会报错
mysql> create or replace view sts_v_1 as select id,name,s_no from student where id<=13 with cascaded check option;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into sts_v_1 values(12,'李广',20140987);
Query OK, 1 row affected (0.02 sec)
mysql> insert into sts_v_1 values(13,'李栋',20202987);
Query OK, 1 row affected (0.04 sec)
mysql> insert into sts_v_1 values(14,'陈.栋',20202087);
ERROR 1369 (HY000): CHECK OPTION failed 'test.sts_v_1'
当通过with check option子句创建视图时,MySQL会通过视图检查正在更改的每一行,例如插入、更新、删除,以使其符合视图的定义,MySQL允许基于另一视图创建视图,它会检查依赖视图中的规则以保持数据一致性,为了确定检查的范围,mysql提供了两个选项:
cascaded和local,默认使用cascaded。
1、当我们创建视图时不加cascaded(级联)或local时,对视图的增删改mysql是不会去检查条件的
create view v_1 as select id,name from student where id <=20;
mysql> create or replace view v_1 as select id,name from student where id<=20;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into v_1 values(15,'暂定');
Query OK, 1 row affected (0.05 sec)
mysql> insert into v_1 values(25,'什么鬼');
Query OK, 1 row affected (0.01 sec)
# 插入不满足条件的值,视图查不出来
mysql> select * from v_1;
---- -----------
| id | name |
---- -----------
| 1 | 张无忌 |
| 2 | 哑婆婆 |
| 3 | 张三丰 |
| 4 | 成昆 |
| 5 | 韦一笑 |
| 6 | 刘邦 |
| 7 | 刘策 |
| 8 | 浏览 |
| 9 | 宋江 |
| 10 | 刘浪 |
| 11 | 章六 |
| 12 | 李广 |
| 13 | 李栋 |
| 15 | 暂定 |
---- -----------
14 rows in set (0.01 sec)
#
mysql> select * from student;
---- ----------- ----------
| id | name | s_no |
---- ----------- ----------
| 1 | 张无忌 | 20210112 |
| 2 | 哑婆婆 | 20210311 |
| 3 | 张三丰 | 20200112 |
| 4 | 成昆 | 20210223 |
| 5 | 韦一笑 | 20201230 |
| 6 | 刘邦 | 20110112 |
| 7 | 刘策 | 20220303 |
| 8 | 浏览 | 20212323 |
| 9 | 宋江 | 21113112 |
| 10 | 刘浪 | 20225313 |
| 11 | 章六 | 20215393 |
| 12 | 李广 | 20140987 |
| 13 | 李栋 | 20202987 |
| 15 | 暂定 | NULL |
| 25 | 什么鬼 | NULL |
---- ----------- ----------
15 rows in set (0.00 sec)
2、如果创建视图v_2并关联了v_1 且加了cascaded,那么对视图的操作必须满足v_1和v_2 所定义的条件。
create view v_2 as select id,name from v_1 where id >=20 with cascaded check option;
mysql> insert into v_2 values(19,'落凤坡'); # 不满足id>=20, 但满足v_1同样不能插入
ERROR 1369 (HY000): CHECK OPTION failed 'test.v_2'
mysql> insert into v_2 values(20,'落凤坡'); # 满足v_1,v_2
Query OK, 1 row affected (0.03 sec)
mysql>
CASCADED级联方式:
local同样会递归去检查依赖条件。
视图的检查选项主要指的是当我们对视图当中的数据进行增删改操作时,检查选项with cascaded/local check option会去检查我们所操作的数据是否符合视图定义时的条件。
对于视图的更新,视图中的行与基表中的行之间必须存在一对一的关系,如果视图包含以下任何一项,则该视图不可更新。比如:1、聚合函数(sum()、min()、max()、count()等);2、distinct、group by、having、union或者union all这些关键字。
mysql> create view v_3 as select count(*) from student;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into v_3 values(16);
ERROR 1471 (HY000): The target table v_3 of the INSERT is not insertable-into
使用了聚合函数后视图和基表已经不是一一对应的了,所以不能插入也不能更新。
那么视图到底有什么作用呢,首先视图是不是操作很简单,它不仅可以简化用户对数据的理解,也可以简化它们的操作,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次都指定全部条件。其次是安全,数据库是可以授权的对吧,但是不能授权到数据库特定行和特点列上,通过视图用户只能查询和修改它们所能见到的数据。最后,视图可以帮助用户屏蔽真实表结构变化带来的影响,比如给字段取别名。
实际生产中为保证数据的安全,比如对开发人员在操作king_user表时,只能看到表的基本字段,屏蔽掉邮箱地址和手机号。
create view king_v as select id,name,profession,age,gender,status,createtime from king_user; 当开发要查询这张表的数据的时候,让他查king_v视图即可。