MySQL/MariaDB视图详解(2)

由于是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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/19be6ad8e4ca0ce7829d479b76ff9ad6.html