文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

27.10 视图的限制

视图定义中可以引用的最大表数为 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.6.3 节,“可更新和可插入视图”

当前视图实现存在一个缺陷。如果用户被授予创建视图所需的必要基本权限(CREATE VIEWSELECT 权限),则该用户无法调用 SHOW CREATE VIEW 来查看该对象,除非该用户还被授予 SHOW VIEW 权限。

这个缺陷会导致使用 mysqldump 备份数据库时出现问题,这可能会由于权限不足而失败。这个问题在 Bug #22062 中有描述。

解决这个问题的方法是管理员手动向被授予 CREATE VIEW 的用户授予 SHOW 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 语句。但是,这不会更改原始视图定义,这可能会导致后续转储操作出现问题。