【发布时间】:2011-12-07 00:12:14
【问题描述】:
如果我JOIN 或CROSS APPLY 两个表并创建一个VIEW,当我更新两个表中的任何一个或向其中任何一个添加记录时,视图会自动更新吗?
这些新记录会显示在VIEW 中吗?
【问题讨论】:
-
不,最快的方法是谷歌搜索:)
如果我JOIN 或CROSS APPLY 两个表并创建一个VIEW,当我更新两个表中的任何一个或向其中任何一个添加记录时,视图会自动更新吗?
这些新记录会显示在VIEW 中吗?
【问题讨论】:
是的,每次您使用它们时,它们都会更新。
我认为微软非常清楚地总结了视图是什么:
可以将视图视为虚拟表或存储查询。
http://msdn.microsoft.com/en-us/library/aa214068%28v=sql.80%29.aspx
视图不会自动缓存。
当您从视图中SELECT 时,数据库必须运行存储在视图中的查询以获取要在您的语句中使用的结果集
您在视图中“看到”的数据实际上并未存储在任何地方,而是从动态表中生成的。
因此要小心运行非常复杂的视图。始终考虑在访问其结果集之前必须执行视图。
【讨论】:
INSERT INTO dbo.MyView (myCol) VALUES ('test') - 它存储在哪里?
GROUP BY、TOP 等语句的影响,WITH CHECK OPTION 不能使用等。有关详细信息,请参阅链接。
视图基本上是一个存储查询,它不包含任何数据,所以不,它不会在构建它的表时更新。但是,只要您引用该视图,它所基于的查询就会运行,因此您将看到对基表所做的更改。
【讨论】:
是的,视图是针对基础表/视图的 SELECT 查询。如果您修改基础表中的数据,并且该范围包含在视图定义中,那么您将看到修改后的数据。
【讨论】:
是的,每次都会更新记录。
但是如果你修改表定义。
别忘了refresh查看。
exec sp_refreshview @viewname
不要在视图定义中使用SELECT *,而是使用column name
【讨论】:
只需添加到@Curt 的答案,如果您对基础表所做的更新是添加或删除数据,则视图会使用新数据自动更新。
如果您从基础表中添加或删除列(基本上是 View 的定义),那么您需要运行 sp_RefreshView 存储过程以在您的视图中反映新架构。
【讨论】:
是的,如果您查询一个视图,它将在它所基于的表中反映更改的数据。
我阅读了这些答案,这让我质疑 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
【讨论】:
Phtttt 对于 7 年后的价值,我选择了 Neville Kuyt 2011 年 10 月 13 日 14:07 推荐的内容。
不久前一些愚蠢的采访询问如果您更新视图,OG 表中的数据是否会更新。我想是的。所以面试后我测试了它。从一些简单的表创建简单的视图。编写了一个简单的更新语句来更新 PKId= 不管的列的值,然后对 View 和 OG 表进行选择,并且在两个结果集中更新列。 因此,是的,您将通过更新视图来更新原始表格内容。
【讨论】: