23.9 视图限制

一个视图的定义中可以引用的最大 table 数为 61.

视图处理未优化:

  • 无法在视图上创建索引。

  • 索引可用于使用合并算法处理的视图。但是,使用临时 table 算法处理的视图无法利用其基础 table 上的索引(尽管可以在临时 table 的生成过程中使用索引)。

在 MySQL 5.7.7 之前,子查询不能在视图的FROM子句中使用。

有一个一般原则,即您不能修改 table 并不能从子查询的同一 table 中进行选择。参见第 13.2.10.12 节,“子查询的限制”

如果从从 table 中选择的视图中进行选择,如果该视图从子查询中的 table 中进行选择,并且该视图是使用合并算法评估的,则同样的原理也适用。例:

CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);

UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;

如果视图是使用临时 table 评估的,则可以*从视图子查询的 table 中进行选择,并仍然在外部查询中修改该 table。在这种情况下,视图将存储在临时 table 中,因此您并不是 true 从子查询的 table 中选择并“同时”对其进行修改。 (这是您可能希望通过在视图定义中指定ALGORITHM = TEMPTABLE来强制 MySQL 使用临时 table 算法的另一个原因.)

您可以使用DROP TABLEALTER TABLE删除或更改视图定义中使用的 table。 DROPALTER操作没有警告结果,即使这会使视图无效。而是,当使用视图时,稍后会发生错误。 CHECK TABLE可用于检查已被DROPALTER操作无效的视图。

关于视图的可更新性,视图的总体目标是,如果任何视图在理论上都是可更新的,则在实践中应该是可更新的。 MySQL 尽快。从理论上讲,许多可更新的视图现在都可以更新,但是仍然存在局限性。有关详细信息,请参见第 23.5.3 节“可更新和可插入的视图”

当前视图的实现存在一个缺点。如果授予用户创建视图所需的基本特权(CREATE VIEWSELECT特权),则除非该用户也被授予SHOW VIEW特权,否则该用户将无法在该对象上调用显示创建视图

该缺陷可能导致使用mysqldump备份数据库时出现问题,这可能由于权限不足而失败。错误#22062 中描述了此问题。

该问题的解决方法是 Management 员手动将SHOW VIEW特权授予授予CREATE VIEW的用户,因为在创建视图时 MySQL 不会隐式授予它。

视图没有索引,因此索引提示不适用。从视图中选择时不允许使用索引提示。

显示创建视图使用AS alias_name子句为每列显示视图定义。如果从 table 达式创建列,则默认别名为 table 达式文本,该文本可能会很长。 CREATE VIEW语句中列名的别名会根据最大 64 个字符的列长度(而不是 256 个字符的最大别名长度)进行检查。结果,如果任何列别名超过 64 个字符,则从显示创建视图的输出创建的视图将失败。在以下情况下,别名过长的视图可能会导致问题:

  • 视图定义无法复制到强制列长度限制的较新副本。

  • 无法将使用mysqldump创建的转储文件加载到强制执行列长限制的服务器中。

任一问题的解决方法是修改每个有问题的视图定义,以使用提供较短列名的别名。然后,该视图将正确复制,并且可以转储和重新加载而不会引起错误。要修改定义,请使用DROP VIEWCREATE VIEW再次拖放并创建视图,或使用创建或替换视图替换定义。

对于在转储文件中重新加载视图定义时发生的问题,另一个解决方法是编辑转储文件以修改其CREATE VIEW语句。但是,这不会更改原始视图定义,这可能会导致后续转储操作出现问题。