10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 236.9 kb
手册页(Zip)- 348.5 kb
信息(Gzip)- 3.4 mb
信息(邮政编码)- 3.4 mb
本手册节选

13.1.21 CREATE VIEW语句

创建[或替换][algorithm = {undefined | merge | temptable}] [definer = .用户[sql security {definer | invoker}]视图view_name[(column_list))select_statement[带[级联| local]检查选项]

创建视图语句创建新视图,或替换现有视图或替换给出了从句。如果该视图不存在,创建或替换视图创建视图.如果视图存在,创建或替换视图取代它。

有关视图使用限制的信息,请参见第23.9节“视图限制”

select_statement是一个选择语句,提供视图的定义。(从视图中选择,实际上是使用选择声明。)的select_statement可以从基表或其他视图中进行选择。

视图定义为在创建时,并且不受基础表定义的后续更改的影响。例如,如果视图被定义为SELECT *在表上,后来添加到表中的新列不会成为视图的一部分,从表中删除的列在从视图中选择时会导致错误。

算法子句会影响MySQL如何处理视图。的定义者而且SQL安全子句指定在视图调用时检查访问特权时要使用的安全上下文。的带有检查选项子句可以用于约束对视图引用的表中的行进行插入或更新。这些子句将在本节后面描述。

创建视图语句要求创建视图属性所选择的每一列都具有一定的特权选择声明。类中其他地方使用的列选择声明,你必须有选择特权。如果或替换条款是存在的,你也必须有下降视图的特权。如果定义者子句存在时,所需的特权取决于用户值,如中所讨论第23.6节,存储对象访问控制

当视图被引用时,特权检查将在本节后面进行描述。

视图属于数据库。默认情况下,在默认数据库中创建一个新视图。要在给定数据库中显式创建视图,请使用db_name.view_name使用数据库名称限定视图名称的语法:

创建视图测试。vAS SELECT * FROM t;

类中的非限定表或视图名称选择语句也会根据默认数据库进行解释。通过使用适当的数据库名称限定表或视图名称,视图可以引用其他数据库中的表或视图。

在数据库中,基表和视图共享相同的名称空间,因此基表和视图不能具有相同的名称。

检索的列选择语句可以是对表列的简单引用,也可以是使用函数、常量值、操作符等的表达式。

视图必须具有惟一的列名,不能有重复的列名,就像基表一样。方法检索的列的名称默认为选择语句用于视图列名。若要为视图列定义显式名称,请指定可选参数column_list子句作为逗号分隔的标识符列表。名字的数量column_list方法检索的列数必须相同选择声明。

视图可以从多种类型中创建选择语句。它可以引用基表或其他视图。它可以使用连接,联盟和子查询。的选择甚至不需要参考任何表格:

创建视图v_today(今天)作为SELECT当前日期

下面的例子定义了一个视图,它从另一个表中选择两列,以及从这些列中计算出的表达式:

mysql>创建表t(数量INT,价格INT)mysql> INSERT INTO t VALUES(3,50);mysql> CREATE VIEW v AS SELECT quantity, price, quantity *price AS value FROM tmysql> SELECT * FROM v;+------+-------+-------+ | 数量价格| |值  | +------+-------+-------+ | 3 | | 150  | +------+-------+-------+

视图定义受以下限制:

  • 选择语句不能引用系统变量或用户定义变量。

  • 在存储的程序中选择语句不能引用程序参数或局部变量。

  • 选择语句不能引用预处理语句参数。

  • 定义中引用的任何表或视图都必须存在。如果在创建视图之后,该定义引用的表或视图被删除,则使用该视图会导致错误。要检查视图定义是否存在此类问题,请使用检查表声明。

  • 该定义不能指a临时表,并且不能创建临时视图。

  • 不能将触发器与视图关联。

  • 中的列名的别名选择语句将根据64个字符的最大列长度(而不是256个字符的最大别名长度)进行检查。

命令在视图定义中被允许,但如果您使用具有自己的语句从视图中进行选择,则会忽略它命令

对于定义中的其他选项或子句,它们被添加到引用视图的语句的选项或子句中,但效果未定义。例如,如果视图定义包含限制子句,然后使用具有自己语句的语句从视图中进行选择限制子句时,未定义应用哪个限制。同样的原则也适用于选择所有截然不同的,或SQL_SMALL_RESULT那就是选择关键字和to子句,如更新共享模式锁定,过程

如果通过改变系统变量来改变查询处理环境,可能会影响从视图中获得的结果:

mysql> CREATE VIEW v (mycol) AS SELECT 'abc';mysql> SET sql_mode = ";mysql> SELECT "mycol" FROM v;+-------+ | mycol  | +-------+ | mycol  | +-------+ 1行组(0.01秒)mysql >设置sql_mode =“ANSI_QUOTES”;mysql> SELECT "mycol" FROM v;+-------+ | mycol  | +-------+ | 美国广播公司  | +-------+ 1行集(0.00秒)

定义者而且SQL安全子句决定在执行引用视图的语句时检查视图的访问权限时使用哪个MySQL帐户。有效的SQL安全特征值为定义者(默认值)和调用程序.这表明所需的特权必须分别由定义或调用视图的用户持有。

如果定义者子句存在时,则用户值应该是MySQL帐户指定为user_name“@”host_nameCURRENT_USER,或CURRENT_USER ().允许用户值取决于您所拥有的特权,如中所讨论的第23.6节,存储对象访问控制.有关视图安全性的其他信息,请参见该部分。

如果定义者子句时,默认定义者是执行创建视图声明。这和指定是一样的Definer = current_user明确。

在视图定义中,CURRENT_USER函数返回视图的定义者值。属性定义的视图SQL安全调用程序特点,CURRENT_USER返回视图调用者的帐户。有关视图中的用户审计的信息,请参见第6.2.18节“基于sql的帐户活动审计”

类定义的存储例程中SQL安全定义器特点,CURRENT_USER返回例程的定义者价值。这也会影响在这样的例程中定义的视图,如果视图定义包含定义者的价值CURRENT_USER

MySQL像这样检查视图权限:

  • 在视图定义时,视图创建者必须拥有使用视图访问的顶级对象所需的特权。例如,如果视图定义引用表列,则创建者必须对定义的选择列表中的每个列具有某些特权,并且选择定义中其他地方使用的每个列的特权。如果定义引用了存储的函数,则只能检查调用该函数所需的特权。函数调用时所需的特权只能在执行时进行检查:对于不同的调用,函数内可能采用不同的执行路径。

  • 引用视图的用户必须有适当的权限来访问它(选择要从中选择,插入插入,等等。)

  • 当视图被引用时,该视图所访问的对象的特权将根据该视图所持有的特权进行检查定义者帐户或调用者,取决于是否SQL安全特点是定义者调用程序,分别。

  • 如果对视图的引用导致执行存储的函数,则在函数中执行的语句的权限检查取决于该函数是否SQL安全特点是定义者调用程序.如果安全特征为定义者函数的权限运行定义者帐户。如果特征是调用程序,该函数使用由视图决定的特权运行SQL安全的特点。

示例:视图可能依赖于存储的函数,而该函数可能调用其他存储的例程。例如,下面的视图调用一个存储函数f ()

CREATE v AS SELECT * FROM t WHERE t.id = f(t.name);

假设f ()包含如下语句:

如果name为NULL,则调用p1();调用p2();如果;

中执行语句所需的权限f ()需要检查的时候f ()执行。这可能意味着需要特权p1 ()p2 (),取决于内部的执行路径f ().必须在运行时检查这些特权,并且必须拥有这些特权的用户由SQL安全视图的值v这个函数f ()

定义者而且SQL安全视图子句是标准SQL的扩展。在标准SQL中,使用的规则处理视图SQL安全定义器.该标准规定视图的定义者(与视图模式的所有者相同)在视图上获得适用的特权(例如,选择),也许会同意。MySQL没有模式的概念老板,因此MySQL添加了一个子句来标识定义器。的定义者条款是一种延伸,其意图是拥有标准所拥有的;也就是说,定义视图的人的永久记录。这就是默认的原因定义者Value是视图创建者的帐户。

可选算法子句是标准SQL的MySQL扩展。它会影响MySQL处理视图的方式。算法取三个值:合并易被诱惑的,或未定义的.有关更多信息,请参见第23.5.2节,视图处理算法,以及章节8.2.2.4,“使用合并或物化优化派生表和视图引用”

有些视图是可更新的。也就是说,你可以在这样的语句中使用它们更新删除,或插入更新基础表的内容。对于可更新的视图,视图中的行与底层表中的行之间必须存在一对一的关系。还有其他一些构造使视图不可更新。

视图中生成的列被认为是可更新的,因为可以对它进行赋值。但是,如果显式地更新这样的列,则唯一允许的值为默认的.有关生成列的信息,请参见章节13.1.18.7,“创建表和生成的列”

带有检查选项子句可用于可更新视图,以防止对行进行插入或更新在哪里条款select_statement是真的。

在一个带有检查选项子句用于可更新视图当地的而且级联当视图是根据另一个视图定义时,关键字决定了检查测试的范围。的当地的关键字限制检查选项只有被定义的视图。级联导致对底层视图的检查也被计算。当没有给出关键字时,默认值为级联

有关可更新视图和带有检查选项条款,请参阅第23.5.3节“可更新和可插入视图”,第23.5.4节“带有CHECK OPTION子句的视图”

在MySQL 5.7.3之前创建的视图包含命令整数在视图计算时可能导致错误。考虑这些视图定义,它们使用命令用序数表示的:

CREATE VIEW v1 AS SELECT x, y, z FROM t ORDER BY 2CREATE VIEW v2 AS SELECT x, 1, z FROM t ORDER BY 2

在第一种情况下,按2排序引用已命名的列y.在第二种情况下,它指的是常数1。对于从任一视图中选择少于2列的查询(在命令子句),如果服务器使用MERGE算法计算视图,则会发生错误。例子:

mysql> SELECT x FROM v1;错误1054 (42S22):未知列'2'在'order子句' mysql> SELECT x FROM v2;错误1054 (42S22):“order子句”中的未知列“2”

从MySQL 5.7.3开始,为了处理这样的视图定义,服务器将它们以不同的方式写入.frm存储视图定义的文件。这种差异是显而易见的显示创建视图.在此之前,.frm文件包含这个按2排序条款:

对于v1: ORDER BY 2对于v2: ORDER BY 2

从5.7.3开始,.frm文件包含:

对于v1: ORDER BY ' t '。' y '表示v2: ORDER BY "

也就是说,对于v1, 2被引用到所引用的列的名称所取代。为v2, 2被常量字符串表达式取代(按常量排序没有影响,所以按任何常量排序都可以)。

如果遇到刚才描述的视图计算错误,请删除并重新创建视图,以便.frm文件包含更新后的视图表示形式。或者,对于视图v2该顺序由一个常数值,删除和重新创建的视图与no命令条款。