MySQL 8.4 参考手册  /  存储对象  /  视图的限制

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;

如果视图使用临时表进行评估,则您可以在视图子查询中从表中选择,并且仍然可以在外部查询中修改该表。在这种情况下,视图存储在临时表中,因此您实际上并没有在子查询中从表中选择并同时修改它。(这是您可能希望通过在视图定义中指定 ALGORITHM = TEMPTABLE 来强制 MySQL 使用临时表算法的另一个原因。)

您可以使用 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 alias_name 子句为每个列显示视图定义。如果列是从表达式创建的,则默认别名为表达式文本,这可能非常长。 CREATE VIEW 语句中列名的别名将针对 64 个字符的最大列长度(而不是 256 个字符的最大别名长度)进行检查。因此,如果任何列别名超过 64 个字符,则从 SHOW CREATE VIEW 的输出创建的视图将失败。这会导致以下情况下的问题,因为视图的别名过长

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

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

解决这两个问题的变通方法是修改每个有问题的视图定义,以便使用提供更短列名的别名。然后,视图可以正确地复制,并且可以转储和重新加载,而不会导致错误。要修改定义,请使用 DROP VIEWCREATE VIEW 再次删除并创建视图,或者使用 CREATE OR REPLACE VIEW 替换定义。

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