zoukankan      html  css  js  c++  java
  • 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(",");

    }

     

    }

     

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/attilax/p/5963472.html
Copyright © 2011-2022 走看看