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,视图的结果用于平放临时表中,然后用它执行语句。

 

对此UNDEFINED,MySQL将精选所假设使用的算法。如果可能,它倾向被MERGE而非是TEMPTABLE,这是以MERGE通常更实惠,而且只要利用了临时表,视图是不可更新

 

当用户创建视图时,mysql默认使用相同种植undefine的拍卖算法,就是碰头自行在统一及临时表内进行选择。

 

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

转载请注明来源: http://www.cnblogs.com/attilax/

 

2. 不行更新的视图:

或多或少视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等报告句被使用其,以更新基表的始末。对于可更新的视图,在视图中之行和基表中之行之间必须持有相当的涉及。还有部分一定的另外组织,这类似组织会令视图不可更新。更有血有肉地摆,如果视图包含下述结构面临之其他一样种植,那么她就是不行更新的:

 

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

 

·         DISTINCT

 

·         GROUP BY

 

·         HAVING

 

·         UNION或UNION 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(“,”);

}

 

}

 

 

网站地图xml地图