昨天去某公司面试数据库,问到视图能不能更新,更新的是那个表,大概是这个问题吧。我突然回忆起以前用sqlserver的时候好像做个这个实验,更新过视图,于是我就答了可以更新,更新的是基表。结果被人鄙视了一番说视图只是一个虚拟表,怎么能更新之类云云。由于我学艺不精,而且是在面试,在我不能完全确定的情况下,否定了自己的看法,但是面试完了之后,越想越不对,于是上网查了,发现视图确实是可以更新的,而且还能够插入。
带个链接,微软关于更新视图的帮助文档:通过视图修改数据
附带可更新视图的条件
只要满足下列条件,即可通过视图修改基础基表的数据:
-
任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。
-
视图中被修改的列必须直接引用表列中的基础数据。 不能通过任何其他方式对这些列进行派生,如通过以下方式:
-
聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
-
计算。 不能从使用其他列的表达式中计算该列。 使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。
-
-
被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。
-
TOP 在视图的 select_statement 中的任何位置都不会与 WITH CHECK OPTION 子句一起使用。
发此文感叹学艺不精不仅害自己还会害别人啊,另外,公司面试官最好能够对自己提出的问题做个全面的了解,技术发展太快,有些东西也不是你以为的那个样子。