Skip to content

mariadb视图 ​

本质上视图是个虚拟表,可以查询,更新,会将数据更新到基础表.

sql
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [IF NOT EXISTS] view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

注意点: ​

  1. 创建view时,sql中不能包含子查询;
  2. 使用Replace时,view存在则等同于alter;
  3. 默认为with cascaded check option,即在更新视图时,需要满足视图的约束条件.可以使用with local check option跳过检查;
  4. 视图中的字段是固定化的,即create view name as select * from table后,view的字段和table是一致的,但alter table新增字段后,视图并不包含table新增的字段;
  5. view定义的select语句中不能出现oreder by,除非使用Top(limit),此时order by只是为了满足top数量要求;
  6. 视图默认使用undefined算法,即由数据库自己决定使用merge还是temptable算法,更倾向于merge,默认为merge;
  7. merge算法:合并使用视图的sql语句以及视图定义的语句,替换为基础表的表名和字段名;
  8. temptable算法: 将视图定义的语句执行的结果放入临时表,然后使用临时表进行操作;
  9. 包含这些情况不使用merge算法: having, limit, group by, distinct, union, union all, select中有子查询, 没有基础表, 使用了聚合函数(MAX, COUNT, SUM等);
  10. 使用check table view_name来检查无效视图, 因为视图创建后,基础表可能删除或者更新视图用到的字段;
  11. 嵌套视图可能会出现列错位等导致列不对等的情况,导致读取数据错误,因为创建嵌套视图后更新了base视图;

参考 ​

https://ignorantshr.github.io/person-blog/mysql/15. MySQL视图/#11-mysql