MySQL 8.0 参考手册  / 第25章存储对象  /  25.9 视图限制

25.9 视图限制

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

视图处理未优化:

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

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

有一个通用原则,您不能修改表并从子查询中的同一个表中进行选择。请参阅 第 13.2.11.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 使用 temptable 算法的另一个原因 。)

您可以使用DROP TABLEor ALTER TABLE删除或更改视图定义中使用的表。DROPor操作没有警告结果ALTER,即使这会使视图无效。相反,稍后会在使用视图时发生错误。CHECK TABLE可用于检查已被DROPALTER 操作无效的视图。

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

目前的观点实施存在缺陷。如果用户被授予创建视图所需的基本权限(CREATE VIEWSELECT权限),则该用户不能调用SHOW CREATE VIEW该对象,除非该用户也被授予该 SHOW VIEW权限。

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

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

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

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

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

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

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

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