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