mysql视图创建怎么做 mysql视图创建与管理( 二 )


mysql INSERT INTO t VALUES(3, 50);
mysql CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql SELECT * FROM v;
+------+-------+-------+
| qty| price | value |
+------+-------+-------+
|3 |50 |150 |
+------+-------+-------+
视图定义服从下述限制:
·SELECT语句不能包含FROM子句中的子查询 。
·SELECT语句不能引用系统或用户变量 。
·SELECT语句不能引用预处理语句参数 。
·在存储子程序内,定义不能引用子程序参数或局部变量 。
·在定义中引用的表或视图必须存在 。但是,创建了视图后 , 能够舍弃定义引用的表或视图 。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句 。
·在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图 。
·在视图定义中命名的表必须已存在 。
·不能将触发程序与视图关联在一起 。
在视图定义中允许使用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 。

推荐阅读