mysql怎么创建试图 mysql中创建视图的语句( 三 )


·不能将触发程序与视图关联在一起 。
在视图定义中允许使用ORDER BY,但是 , 如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略 。
对于定义中的其他选项或子句,它们将被增加到引用视图的语句的选项或子句中,但效果未定义 。例如,如果在视图定义中包含LIMIT子句,而且从特定视图进行了选择,而该视图使用了具有自己LIMIT子句的语句,那么对使用哪个LIMIT未作定义 。相同的原理也适用于其他选项,如跟在SELECT关键字后的ALL、DISTINCT或SQL_SMALL_RESULT,并适用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE 。
如果创建了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的结果:
mysql CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
Query OK, 0 rows affected (0.00 sec)
mysql SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| latin1| latin1_swedish_ci|
+-------------------+---------------------+
1 row in set (0.00 sec)
mysql SET NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| utf8| utf8_general_ci|
+-------------------+---------------------+
1 row in set (0.00 sec)
可选的ALGORITHM子句是对标准SQL的MySQL扩展 。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED 。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的) 。算法会影响MySQL处理视图的方式 。
对于MERGE , 会将引用视图的语句的文本与视图定义合并起来 , 使得视图定义的某一部分取代语句的对应部分 。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句 。
对于UNDEFINED,MySQL将选择所要使用的算法 。如果可能 , 它倾向于MERGE而不是TEMPTABLE , 这是因为MERGE通常更有效 , 而且如果使用了临时表 , 视图是不可更新的 。
明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定 。与MERGE算法相比,锁定释放的速度更快 , 这样,使用视图的其他客户端不会被屏蔽过长时间 。
视图算法可以是UNDEFINED , 有三种方式:
·在CREATE VIEW语句中没有ALGORITHM子句 。
·CREATE VIEW语句有1个显式ALGORITHM = UNDEFINED子句 。
·为仅能用临时表处理的视图指定ALGORITHM = MERGE 。在这种情况下,MySQL将生成告警 , 并将算法设置为UNDEFINED 。
正如前面所介绍的那样,通过将视图定义中的对应部分合并到引用视图的语句中 , 对MERGE进行处理 。在下面的示例中 , 简要介绍了MERGE的工作方式 。在该示例中,假定有1个具有下述定义的视图v_merge:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3100;
示例1:假定发出了下述语句:
SELECT * FROM v_merge;
MySQL以下述方式处理语句:
·v_merge成为t
·*成为vc1、vc2,与c1、c2对应
·增加视图WHERE子句
所产生的将执行的语句为:
SELECT c1, c2 FROM t WHERE c3100;
示例2:假定发出了下述语句:
SELECT * FROM v_merge WHERE vc1100;
该语句的处理方式与前面介绍的类似,但vc1100变为c1100,并使用AND连接词将视图的WHERE子句添加到语句的WHERE子句中(增加了圆括号以确保以正确的优先顺序执行子句部分) 。所得的将要执行的语句变为:

推荐阅读