【问题标题】:Are Views automatically updated视图是否自动更新
【发布时间】:2011-12-07 00:12:14
【问题描述】:

如果我JOINCROSS APPLY 两个表并创建一个VIEW,当我更新两个表中的任何一个或向其中任何一个添加记录时,视图会自动更新吗?

这些新记录会显示在VIEW 中吗?

【问题讨论】:

  • 不,最快的方法是谷歌搜索:)

标签: sql view


【解决方案1】:

是的,每次您使用它们时,它们都会更新。

我认为微软非常清楚地总结了视图是什么:

可以将视图视为虚拟表或存储查询。

http://msdn.microsoft.com/en-us/library/aa214068%28v=sql.80%29.aspx

视图不会自动缓存。

当您从视图中SELECT 时,数据库必须运行存储在视图中的查询以获取要在您的语句中使用的结果集

您在视图中“看到”的数据实际上并未存储在任何地方,而是从动态表中生成的。

因此要小心运行非常复杂的视图。始终考虑在访问其结果集之前必须执行视图。

【讨论】:

  • +1 :或内联扩展的宏,形成封闭代码的一部分,而不是预先计算的结果集。
  • 如果视图中的数据没有存储在任何地方,当您向视图添加一行时INSERT INTO dbo.MyView (myCol) VALUES ('test') - 它存储在哪里?
  • 您不能在视图中插入记录
  • 对不起,我想我刚刚找到了答案——数据将被插入到基础表中(如果所有插入列都来自单个基础表)。
  • 澄清一下,如果视图遵循一组详细的要求on MSDN:所有列必须来自一个基表,列不能派生,则可以将记录插入视图,这些列不受GROUP BYTOP 等语句的影响,WITH CHECK OPTION 不能使用等。有关详细信息,请参阅链接。
【解决方案2】:

视图基本上是一个存储查询,它不包含任何数据,所以不,它不会在构建它的表时更新。但是,只要您引用该视图,它所基于的查询就会运行,因此您将看到对基表所做的更改。

【讨论】:

    【解决方案3】:

    是的,视图是针对基础表/视图的 SELECT 查询。如果您修改基础表中的数据,并且该范围包含在视图定义中,那么您将看到修改后的数据。

    【讨论】:

      【解决方案4】:

      是的,每次都会更新记录。

      但是如果你修改表定义。 别忘了refresh查看。

      exec sp_refreshview @viewname

      不要在视图定义中使用SELECT *,而是使用column name

      【讨论】:

        【解决方案5】:

        只需添加到@Curt 的答案,如果您对基础表所做的更新是添加或删除数据,则视图会使用新数据自动更新。 如果您从基础表中添加或删除列(基本上是 View 的定义),那么您需要运行 sp_RefreshView 存储过程以在您的视图中反映新架构。

        【讨论】:

          【解决方案6】:

          简答

          是的,如果您查询一个视图,它将在它所基于的表中反映更改的数据。

          长答案

          前言

          我阅读了这些答案,这让我质疑 Views 是如何工作的,所以我做了一些研究以及我找到了哪些支持,但也添加到了列出的答案中,所以我想将其添加到锅中。

          我在底部使用 *# 来获取我的引用。

          概述

          有不同类型的视图,它们有不同类型的行为。一些被存储然后经常更新,而另一些则根本不存储并即时计算。

          视图的定义

          “视图是一个虚拟表,其内容由查询定义...除非建立索引,否则视图不会作为存储在数据库中的一组数据值存在。” *1

          非索引视图

          “与永久表不同,除非您在其上创建索引,否则视图没有其数据的物理表示。每当您在非索引视图上发出查询时,SQL Server 实际上必须访问基础表。除非另有说明。 .." *1

          所以非索引视图是在调用时计算的。

          索引视图

          “索引视图是一个已经物化的视图。这意味着视图定义已经被计算并且结果数据就像一个表一样被存储。” *2

          由于索引视图的存储,它们不太适合经常更新的表,因为它们需要不断更新物化数据及其索引。

          回答

          在这两种情况下,索引视图或非索引视图会在您调用视图或根据是否已索引进行更改时反映它们所引用的表中的更改。

          参考文献

          *1 Inside Microsoft SQL Server 2008 T-SQL Programming 由 Microsoft Press 出版 版权所有 2010

          *2 https://docs.microsoft.com/en-us/sql/relational-databases/views/views?view=sql-server-ver15

          【讨论】:

          • 在 10 年前提出问题后将我选择的答案更改为 :) 我验证索引视图已存储(物化)并且不必获取新数据,它已经被缓存,在它之前刷新运行,非常适合仓库环境 - video tutorial
          【解决方案7】:

          Phtttt 对于 7 年后的价值,我选择了 Neville Kuyt 2011 年 10 月 13 日 14:07 推荐的内容。

          不久前一些愚蠢的采访询问如果您更新视图,OG 表中的数据是否会更新。我想是的。所以面试后我测试了它。从一些简单的表创建简单的视图。编写了一个简单的更新语句来更新 PKId= 不管的列的值,然后对 View 和 OG 表进行选择,并且在两个结果集中更新列。 因此,是的,您将通过更新视图来更新原始表格内容。

          【讨论】:

          • 这并不能真正回答问题。视图只能通过视图更新底层表,前提是它只包含一个表,有主键等more here
          猜你喜欢
          • 2023-03-19
          • 2022-10-28
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 2023-01-12
          • 1970-01-01
          • 2011-12-26
          • 1970-01-01
          相关资源
          最近更新 更多