## 25.9 浏览限制

[](<>)[](<>)[](<>)[](<>)

视图定义中可以引用的最大表数为 61。

视图处理未优化：

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

-   索引可用于使用合并算法处理的视图。但是，使用 temptable 算法处理的视图无法利用其基础表上的索引（尽管可以在生成临时表期间使用索引）。

    有一个一般原则，您不能在子查询中修改表并从同一个表中进行选择。看[第 13.2.11.12 节，“对子查询的限制”](subquery-restrictions.html).

    如果从从表中选择的视图中进行选择，如果视图从子查询中的表中选择并且使用合并算法评估视图，则同样的原则也适用。例子：


```
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;
```

如果使用临时表评估视图，您*能够*从视图子查询中的表中选择，并且仍然在外部查询中修改该表。在这种情况下，视图存储在一个临时表中，因此您并没有真正从子查询中的表中选择并同时对其进行修改。（这是您可能希望通过指定强制 MySQL 使用 temptable 算法的另一个原因`算法 = 可取的`在视图定义中。）

您可以使用[`删除表`](drop-table.html)要么[`更改表`](alter-table.html)删除或更改视图定义中使用的表。没有警告结果`降低`要么`改变`操作，即使这会使视图无效。相反，稍后在使用视图时会发生错误。[`检查表`](check-table.html)可用于检查已失效的视图`降低`要么`改变`操作。

关于视图可更新性，视图的总体目标是，如果任何视图在理论上是可更新的，那么它在实践中也应该是可更新的。MySQL 尽快。现在可以更新许多理论上可更新的视图，但仍然存在限制。有关详细信息，请参阅[第 25.5.3 节，“可更新和可插入的视图”](view-updatability.html).

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

当前的视图实现存在一个缺点。如果用户被授予创建视图所需的基本权限（[`创建视图`](privileges-provided.html#priv_create-view)和[`选择`](privileges-provided.html#priv_select)特权），该用户不能调用[`显示创建视图`](show-create-view.html)在该对象上，除非用户也被授予[`显示视图`](privileges-provided.html#priv_show-view)特权。

这个缺点可能会导致在备份数据库时出现问题[**mysql转储**](mysqldump.html), 可能由于权限不足而失败。此问题在错误 #22062 中进行了描述。

该问题的解决方法是管理员手动授予[`显示视图`](privileges-provided.html#priv_show-view)授予被授予用户的权限[`创建视图`](privileges-provided.html#priv_create-view)，因为 MySQL 在创建视图时不会隐式授予它。

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

[`显示创建视图`](show-create-view.html)使用`作为 *`别名`*`每列的子句。如果从表达式创建列，则默认别名是表达式文本，它可能很长。中列名的别名[`创建视图`](create-view.html)根据 64 个字符的最大列长度（而不是 256 个字符的最大别名长度）检查语句。因此，从输出创建的视图[`显示创建视图`](show-create-view.html)如果任何列别名超过 64 个字符，则失败。对于别名过长的视图，这可能会在以下情况下导致问题：

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

-   转储文件创建与[**mysql转储**](mysqldump.html)无法加载到强制列长度限制的服务器中。

    任一问题的解决方法是修改每个有问题的视图定义以使用提供较短列名的别名。然后视图会正确复制，并且可以转储和重新加载而不会导致错误。要修改定义，请删除并再次创建视图[`下拉视图`](drop-view.html)和[`创建视图`](create-view.html)，或将定义替换为[`创建或替换视图`](create-view.html).

    对于在转储文件中重新加载视图定义时出现的问题，另一种解决方法是编辑转储文件以修改其[`创建视图`](create-view.html)陈述。但是，这不会更改原始视图定义，这可能会导致后续转储操作出现问题。
