• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 意见限制

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

    视图处理未优化:

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

    有一个一般原则,即您不能修改表并不能从子查询的同一表中选择。请参见“子查询限制”。

    如果从从表中选择的视图中进行选择,如果该视图从子查询中的表中进行选择,并且该视图是使用合并算法评估的,则同样的原理也适用。例:

    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操作无效的视图。

    关于视图的可更新性,视图的总体目标是,如果任何视图在理论上都是可更新的,则在实践中应该是可更新的。MySQL尽快。从理论上讲,许多可更新的视图现在都可以更新,但是仍然存在局限性。有关详细信息,请参见“更新和插入视图”。

    当前视图的实现存在一个缺点。如果授予用户创建视图所需的基本特权(CREATE VIEWSELECT特权),SHOW CREATE VIEW除非该用户也被授予SHOW VIEW特权,否则该用户将无法调用该对象。

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

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

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

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

    • 视图定义无法复制到强制列长度限制的较新的从属服务器。
    • mysqldump创建的转储文件不能加载到强制执行列长限制的服务器中。

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

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