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