由于是merge算法的视图,在引用视图(此处是查询操作)的时候,会将视图中的各项替换为基表t中的各项。包括:
1."*"号替换为vf1和vf2,它们又替换为t表中的id和name。
2.from子句中的my_view替换为表t。
3.加上视图定义语句中的where子句。
因此,select * from my_view;在执行的时候,会转换为下面的查询语句:
select id,name from t where age<24;
如果查询my_view的时候,使用下面的语句:
MariaDB [test]> select * from my_view where vf1<2;
+-----+--------+
| vf1 | vf2 |
+-----+--------+
| 1 | chenyi |
+-----+--------+
在执行的时候,该语句将替换为下面的语句:
select id,name from t where id<2 and age<24;
只有使用merge算法的时候,视图才是可更新视图,因为temptable算法操作的是填充到临时表中的数据,无法结合基表进行数据更新。
因为merge算法结合了基表,因此它有一些限制,出现了以下情况时不能使用merge算法:
1.HAVING
2.LIMIT
3.GROUP BY
4.DISTINCT
5.UNION
6.UNION ALL
7.使用了聚合函数,如MAX(), MIN(), SUM() or COUNT()
8.在select列表中有子查询
9.没有基表,因为可能引用的是纯值,例如create view va as select 2。
之所以有以上限制,是因为使用了它们之后,视图的结构和基表的机构不一致,无法和基表一一对应,也就无法作为可更新视图。
3.删除、查看视图
可以一次性删除多个视图。
DROP VIEW [IF EXISTS] view_name [, view_name] ...
MySQL/MariaDB中不存在show view status语句。可以使用show table status表和视图的状态信息,使用show tables显示出数据库中的表和视图。
SHOW TABLE STATUS LIKE 'v_city';
查看视图定义语句:
show create view view_name;
还可以从information_schema.views表中查看相关信息,但是要注意的是,在views表中视图名所在的字段称为table_name而不是view_name。如下:
select * from information_schema.views where table_name='view_name';
4.检查无效视图
在创建视图的时候,要求它的基表已存在,否则会报错。但是在视图创建成功后,视图的基表可能会删除掉,或者更新基表中的引用字段。这时视图就已经是无效视图。
如何检测这些无效视图?
可以先在information.schema中查找出有哪些视图,然后再使用check table语句检测。
例如:
check table my_view,my_view2
以下是无效视图检查结果:
MariaDB [test]> check table my_view\G
*************************** 1. row ***************************
Table: test.my_view
Op: check
Msg_type: Error
Msg_text: Table 'test.t' doesn't exist
*************************** 2. row ***************************
Table: test.my_view
Op: check
Msg_type: Error
Msg_text: View 'test.my_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
*************************** 3. row ***************************
Table: test.my_view
Op: check
Msg_type: error
Msg_text: Corrupt
3 rows in set (0.000 sec)