Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Stored Objects  /  Restrictions on Views

27.9 视图限制

在视图定义中,引用表的最大数量是 61。

视图处理不优化:

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

  • 可以使用索引来处理使用合并算法的视图。然而,使用临时表算法处理的视图无法利用其基础表上的索引(尽管可以在生成临时表时使用索引)。

有一般原则,即不能在同一个子查询中修改表并从该表中选择数据。参见 第 15.2.15.12 节,“子查询限制”

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

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 使用临时表算法的原因,方法是将 ALGORITHM = TEMPTABLE 添加到视图定义中。)

您可以使用 DROP TABLEALTER TABLE 删除或修改视图定义中使用的表。不会从 DROPALTER 操作中生成警告,即使这会使视图无效。相反,错误将在稍后出现,当视图被使用时。CHECK TABLE 可以用于检查由 DROPALTER 操作使无效的视图。

关于视图的可更新性,总的目标是,如果任何视图理论上是可更新的,那么它应该在实践中也是可更新的。许多理论上可更新的视图现在可以更新,但是仍然存在限制。详见 第 27.5.3 节,“可更新和可插入视图”

当前视图实现存在一个缺陷。如果用户被授予创建视图所需的基本权限(CREATE VIEWSELECT 权限),那么该用户不能在该对象上调用 SHOW CREATE VIEW,除非该用户也被授予 SHOW VIEW 权限。

该缺陷可能会导致备份数据库时出现问题,使用 mysqldump 失败,因为权限不足。该问题在 Bug #22062 中被描述。

解决该问题的方法是管理员手动授予 SHOW VIEW 权限给被授予 CREATE VIEW 权限的用户,因为 MySQL 不会隐式授予该权限。

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

SHOW CREATE VIEW 使用 AS 别名名称 子句来显示视图定义中的每一列。如果某一列是从表达式创建的,默认别名是表达式文本,该文本可能非常长。CREATE VIEW 语句中的列别名检查对最大列长度的限制为 64 个字符(而不是最大别名长度的 256 个字符)。因此,从 SHOW CREATE VIEW 输出创建的视图将失败,如果任何列别名超过 64 个字符。这可能会在以下情况下引发问题,例如视图别名太长:

  • 视图定义无法复制到新的副本中,因为它们强制执行列长度限制。

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

要解决这两个问题,可以修改有问题的视图定义,以便使用别名提供较短的列名。然后,视图将正确复制,并且可以转储和重新加载而不出现错误。要修改定义,使用 DROP VIEWCREATE VIEW 重新创建视图,或者使用 CREATE OR REPLACE VIEW 替换定义。

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