• Atitit.code base view 视图的实现原理


    Atitit.code base view 视图的实现原理

     

    1视图的执行算法:1

    2不可更新的视图:1

    3关于视图的可插入性:insert2

    4视图定义3

    5调用3

     

    1. 视图的执行算法:

    存在两种执行算法:

    1  Merge:合并的执行方式,每当执行的时候,先将我们视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行;

    2  Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询。

    指的是一个视图是在什么时候执行,依据哪些方式执行;

    对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

     

    对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

     

    对于UNDEFINEDMySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新

     

    当用户创建视图时,mysql默认使用一种undefine的处理算法,就是会自动在合并和临时表内进行选择。

     

    作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

    2. 不可更新的视图:

    某些视图是可更新的。也就是说,可以在诸如UPDATEDELETEINSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

     

    ·         聚合函数(SUM(), MIN(), MAX(), COUNT()等)。

     

    ·         DISTINCT

     

    ·         GROUP BY

     

    ·         HAVING

     

    ·         UNIONUNION ALL

     

    ·         位于选择列表中的子查询

     

    ·         Join

     

    ·         FROM子句中的不可更新视图

     

    ·         WHERE子句中的子查询,引用FROM子句中的表。

     

    ·         仅引用文字值(在该情况下,没有要更新的基本表)。

     

    ·         ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

    3. 关于视图的可插入性:insert

    如果视图满足关于视图列的下述额外要求,可更新的视图也是可插入的:

    ·         不得有重复的视图列名称。

    ·         视图必须包含没有默认值的基表中的所有列。

    ·         视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:

    ·                3.14159

    ·                col1 + 3

    ·                UPPER(col2)

    ·                col3 / col4

    ·                (subquery)

    混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。

    4. 视图定义

    wxb_order

    #left join tabxxx on order_id=order_id

    wxb_order_count,order_id=order_id

     

     

    5. 调用

     

    public List<String> insertSql(Map m) {

    List<String> li = Lists.newArrayList();

    if (m.get("$tabletype") != null && m.get("$tabletype").equals("view")) {

    String[] tabs = new View(m.get("$table"), m.get("$view_store_path"))

    .getTables();

    for (String tab : tabs) {

    Map m2 = MapX.clone(m);

    m2.put("$table"tab);

    String s = get_insert_singleTable_sql(m2);

    li.add(s);

    }

     

    return li;

    }

    return li;

    }

     

     

    package com.attilax.orm;

     

    import java.util.Map;

     

    import com.attilax.io.filex;

    import com.attilax.io.pathx;

    import com.attilax.sql.SqlJoinAst;

    import com.attilax.sql.SqlJoinParser;

     

    public class View {

     

    private Object obj;

    private Object viewStorePath;

     

    public View(String viewName) {

    // TODO Auto-generated constructor stub

    }

     

    public View(Object objectName) {

    this.obj = objectName;

    }

     

    public View(Object objectName, Object viewStorePath) {

    this.obj = objectName;

    this.viewStorePath = viewStorePath;

    }

     

    public String[] getTables() {

    String f = pathx.classPath() + "/" + this.viewStorePath + "/"

    + obj.toString() + ".txt";

    // String t=filex.read(f);

    SqlJoinAst ast = new SqlJoinParser().parse(f);

    String tabs = ast.table;

    for (Map join_tab : ast.joinTables) {

    tabs = tabs + "," + join_tab.get("joinTable");

    }

    return tabs.split(",");

    }

     

    }

     

  • 相关阅读:
    搭建基本的React Native开发环境
    Java跨平台原理
    MySQL主从复制与Atlas读写分离
    自动生成和安装requirements.txt依赖
    Mac 证书错误
    zabbix报警信息设置
    zabbix自定义监控项数据类型错误
    Centos7.6 双网卡,修改默认路由
    linux 安装 websocketd
    土豆聊天 机器人
  • 原文地址:https://www.cnblogs.com/attilax/p/15198697.html
Copyright © 2020-2023  润新知