视图定义中可以引用的最大表数为 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 TABLE
或 ALTER TABLE
来删除或修改视图定义中使用的表。即使这会使视图失效,也不会收到 DROP
或 ALTER
操作的警告。相反,错误会在稍后使用该视图时发生。 CHECK TABLE
可用于检查由于 DROP
或 ALTER
操作而失效的视图。
关于视图的可更新性,视图的总体目标是,如果任何视图在理论上都是可更新的,则它在实践中也应该是可更新的。现在,许多理论上可更新的视图可以更新,但仍然存在限制。有关详细信息,请参阅 第 27.6.3 节,“可更新和可插入视图”。
当前视图实现存在一个缺陷。如果用户被授予创建视图所需的必要基本权限(CREATE VIEW
和 SELECT
权限),则该用户无法调用 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 VIEW
和 CREATE VIEW
重新删除并创建视图,或者使用 CREATE OR REPLACE VIEW
替换定义。
对于在重新加载转储文件中的视图定义时发生的问题,另一个解决方法是编辑转储文件以修改其 CREATE VIEW
语句。但是,这不会更改原始视图定义,这可能会导致后续转储操作出现问题。