MySQL视图更新

昨天在写美团2019秋招笔试题的时候遇到了关于视图是否能更新的问题,忽然感受这个问题以前复习的时候重点关注过,可是却又想不全。今天特意搜了一些资料总结一下。本文主要说明视图的更新限制,如需关于视图的更多知识,参考:MySql视图原理讲解与使用大全html

  1. 视图简介
    1. 视图不是表,不能直接存储数据,是一张虚拟的表,视图和数据库的表存在着对应的关系,咱们在某些状况下是能够经过视图来操做数据库的表,这样能够简化查询操做(通常状况下视图是用来查询用的),在某种条件下是能够利用视图来更新数据库表中的数据的,后面会提到视图的更新。
    2. 通常状况下,在建立有条件限制的视图时,加上 "WITH CHECK OPTION"命令
  2. 视图的更新问题
    某些视图是可更新的。也就是说,能够在UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具备一对一的关系。若是视图包含下述结构中的任何一种,那么它就是不可更新的:数据库

    1. 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
    2. DISTINCT
    3. GROUP BY
    4. HAVING
    5. UNION或UNION ALL
    6. 位于选择列表中的子查询
    7. Join
    8. FROM子句中的不可更新视图
    9. WHERE子句中的子查询,引用FROM子句中的表。
    10. 仅引用文字值(在该状况下,没有要更新的基本表)。
    11. ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

注意:
视图中虽然能够更新数据,可是有不少的限制。通常状况下,最好将视图做为查询数据的虚拟表,而不要经过视图更新数据。由于,使用视图更新数据时,若是没有全面考虑在视图中更新数据的限制,就可能会形成数据更新失败。函数

WITH[CASCADED|LOCAL] CHECK OPTION能不能决定视图是否能更新?

  1. 这两个参数的基本定义以下:
    LOCAL参数表示更新视图时只要知足该视图自己定义的条件便可。
    CASCADED参数表示更新视图时须要知足全部相关视图和表的条件。没有指明时,该参数为默认值。学习

  2. 对于with check option用法,总结以下:
    1. 视图只操做它能够查询出来的数据,对于它查询不出的数据,即便基表有,也不能够经过视图来操做。
    2. 对于update,有with check option,要保证update后,数据要被视图查询出来
    3. 对于delete,有无with check option都同样
    4. 对于insert,有with check option,要保证insert后,数据要被视图查询出来
    5. 对于没有where 子句的视图,使用with check option是多余的

本文参考:MySql视图原理讲解与使用大全 和以前视图学习笔记
如需转载请注明出处:http://www.javashuo.com/article/p-hgetoloa-gx.html.net

相关文章
相关标签/搜索