数据库中的视图是否可更新?

时间:2010-09-23 11:38:27

标签: sql sql-server oracle postgresql

您可以更新数据库中的视图吗? 如果是这样,怎么样? 如果没有,为什么不呢?

12 个答案:

答案 0 :(得分:16)

实际的答案是“它取决于”,没有绝对的。

基本标准是它必须是数据库引擎的可更新视图,也就是说引擎可以唯一地标识要更新的行,其次是字段可更新。如果您的视图具有计算字段或表示父/子连接的乘积,则默认答案可能为否。

然而它也有可能作弊...在MS SQL Server和Oracle中(仅举两个例子)你可以在你试图插入或更新视图时激活触发器,这样你就可以制作服务器没有的内容我认为可以更新为某种东西 - 通常是因为你知道服务器无法从模式中轻易推断出来。

答案 1 :(得分:4)

正确的答案是“它取决于”。例如,您无法更新视图中的聚合列。对于Oracle视图,您可以通过Google获取“可更新的连接视图”,以获取何时可以更新视图的示例。

答案 2 :(得分:3)

PostgreSQL有RULE来创建可更新的VIEW。检查the examples in the manual以了解如何使用它们。

聚苯乙烯。在PostgreSQL中,VIEW是一个RULE,一个选择规则。

答案 3 :(得分:2)

过去无法更新任何视图。视图的主要目的是查看数据,因此得名。它也可以被称为存储查询

今天,许多数据库引擎都支持更新视图。它受到限制,一些更新实际上是不可能的(例如,计算列,分组等)。

答案 4 :(得分:2)

有两种方法:

  1. INSTEAD OF触发器,它基本上将问题转移给用户。你编写了一些完成这项工作的程序代码。当然,不保证正确性,一致性等。从RDBMS引擎的角度来看,无论在视图中进行什么更新,从基表中删除所有内容的触发器都是完美的。

  2. 更加雄心勃勃的是由RDBMS引擎专门处理的视图更新。这里没有取得多大进展:说得客气一点,如果你有一些好主意,那么你可以推出博士论文。在实践中,您最喜欢的RDBMS可能允许一些限制的广告视图更新;查看手册:-)

答案 5 :(得分:2)

是的,它们是可更新的,但并非总是如此。视图可以更新如下:

  • 如果视图包含基于其创建视图的表的主键。

  • 如果视图是基于一个且只有一个表定义的。

  • 如果未使用组和聚合函数定义视图。
  • 如果视图的定义中没有任何distinct子句。
  • 如果应该更新的视图基于另一个视图,则后者应该是可更新的。
  • 如果视图的定义没有任何子查询。

答案 6 :(得分:1)

是的 - 语法与更新表

相同
Update MyView
Set Col1 = "Testing"
Where Col2 = 3
Go

创建可以更新的视图有几个条件。他们可以找到here

修改

我必须添加基于MS SQL的

答案 7 :(得分:1)

是的,您可以,但请查看CREATE VIEW (Transact-SQL)并查看可更新视图

部分

答案 8 :(得分:1)

答案 9 :(得分:1)

在SQL Server中创建视图时,引用的表列(列名和序号位置)的元数据将保留在数据库中。在视图为之前,对引用的基表的任何更改(列重新排序,新列添加等)都不会反映在视图中:

•使用ALTER VIEW语句进行更改 •使用DROP VIEW / CREATE VIEW语句重新创建 •使用系统存储过程sp_refreshview

刷新

答案 10 :(得分:0)

是的,使用INSTEAD OF触发器。

答案 11 :(得分:0)

我们通常不更新视图。写入视图以根据联接和条件放置从各个表中获取数据。

视图只是一种逻辑,可以在调用它时提供所需的数据集。

但不确定在哪种情况下需要更新视图。