在sql server中更新视图的内容,视图对应的表会更新吗

在sql server中更新视图的内容,视图对应的表会更新吗,第1张

整理了下他们的区别和联系,或许还不是那么详细和完整,希望能对你有点帮助!
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,试图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系

视图的更新
•对视图进行insert update delete将会影响其基表,因为视图中不包含任何数据
•不是所有视图都可以更新 (可能引起数据紊乱或者数据无意义)
•含有分组(group by 和 having)
•联接查询
•子查询
•聚合函数
• DISTINCT
•不是迫不得已,不要对视图进行更新 *** 作,因为效率低。视图主要用于查询

在Oracle数据库中,使用大量数据的视图来更新另一个表可能会导致性能问题。视图是一个虚拟表,它是从一个或多个基础表根据查询语句生成的。因此,当你查询一个包含百万级数据的视图时,实际上是在查询底层的表,这可能导致查询速度变慢,尤其是当涉及到多个大表和复杂的连接条件时。

客户反馈说不合理,不能查询视图来更新,这个说法并不完全正确。在Oracle中,你可以通过视图来更新基础表,但是需要满足以下条件:

视图是可更新的。这意味着视图必须满足一定的要求,如不能包含聚合函数、distinct关键字等。

视图的更新 *** 作不会影响到其他表,导致数据不一致。

然而,视图更新 *** 作可能会导致性能问题,因为视图查询的底层表可能很大。在你的情况下,如果视图是可更新的,并且在性能上可接受,那么可以考虑继续使用视图进行更新。否则,你可以考虑以下几种方法来优化这个过程:

对视图进行优化。检查底层查询是否可以进行优化,例如使用更有效的连接条件、索引等。

使用物化视图。物化视图是一个实际的表,它存储了视图的数据。与普通视图相比,物化视图可以大大提高查询性能,因为数据已经被计算和存储在物化视图中。

分批更新。将数据分成较小的批次进行处理,可以减轻数据库的压力,提高性能。

总之,通过视图来更新表并不一定不合理,但是需要考虑视图的可更新性和性能。在实际 *** 作中,应根据具体情况进行权衡,并尽量采用最优的方法来提高性能。

…………

回复:

即使您的表不是视图的基础表,查询百万级的视图来更新表也可能会导致性能问题。这是因为视图查询的底层表可能很大,可能需要执行大量的IO *** 作和计算来获取所需的数据。因此,即使您的表不是视图的基础表,使用视图来更新表也可能会导致性能问题。

如果您只是需要通过视图查询数据而不更新数据,也可能会受到相同的性能问题。如果您的查询涉及到大量的数据和复杂的连接条件,那么查询性能可能会很低。这也可能会影响到其他用户的查询 *** 作。

如果视图不能用于查询更新,您可以要求提供视图中的基础表,并使用基础表进行查询和更新 *** 作。这将消除使用视图时可能遇到的性能问题,因为您可以直接查询和更新基础表。不过,在使用基础表之前,您需要确保查询和更新 *** 作不会影响到其他表的数据完整性。

对于没有复杂处理的 单表 视图, 是可以 UPDATE 的。

例如这样的视图:

CREATE VIEW v_1 AS SELECT FROM 某表。

但是假如你的视图, 是单表的, 带统计的, 那恐怕是不能 直接 UPDATE 了。

例如这样的视图:

CREATE VIEW v_2 AS SELECT id, COUNT() as num FROM 某表--前面是单表的, 下面说多表的 ---

对于2张表的,假如你的查询里面, 这2张表是 一对一的关系。 且视图里面, 包含了主键,那么是可以 UPDATE 的。

例如下面这样的视图:

CREATE VIEW temp_view AS

SELECT

t1name AS t1Name,

t1age AS t1Age,

t2name AS t2Name,

t2age AS t2Age

FROM

t1, t2

WHERE

t1name = t2name

然后直接更新视图。

UPDATE temp_view SET t1Age = t2Age;

完整的例子, 可参考:

>

但是假如你的视图里面的 2个表, 不是一一对应的。

或者是带了 SUM / COUNT 等统计函数的, 那么可能是没办法更新了。

如果是单独的执行两条sql语句是没有问题的,但是你要考虑到后面的东西,视图是不可以更新的,也不可以通过视图去更新数据,只有通过视图绑定的查询表来更新数据。
public static void Do(string name)
{
using (SqlConnection conn = new SqlConnection(_ConnString))
{
try
{
connOpen();
string sql=stringFormat("CREATE View VIew_TABLE1 AS SELECT FROM TABLE1")
SqlCommand cmd = new SqlCommand(sql, conn);
cmdExecuteNonQuery();
cmdCommandText =stringFormat( "UPDATE TABLE1 SET NAME='{0}'",name);
cmdExecuteNonQuery();
connClose();
}
catch (Exception ex)
{
MessageBoxShow(exMessage);
}
}
}
这样只有更新绑定视图的表视图就会跟着更新了

这个十分情况的。
通过试图,修改表数据:
要满足这个条件: 视图中被修改的列必须直接引用表列中的基础数据
建议:试图,主要还是用来保证数据的安全,创建视图,其实降低了数据库的性能(SQL2008经典入门中有详细的解释)。

当然会了,视图是数据库表数据的表现形式,类似于sql查询,视图的数据都来自基础表,所以是一个级联的关系。
基本数据库表类似超市的仓库,存储了符合该表的所有数据;
视图则类似超市的货架,该货架描述了需陈列的商品。
所以数据库的更新、插入与删除 *** 作的是基础数据库表,只影响了视图罗列出来的数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13384258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存