【发布时间】:2011-04-16 05:29:50
【问题描述】:
你能更新数据库中的视图吗? 如果是这样,怎么做? 如果没有,为什么不呢?
【问题讨论】:
标签: sql sql-server oracle postgresql
你能更新数据库中的视图吗? 如果是这样,怎么做? 如果没有,为什么不呢?
【问题讨论】:
标签: sql sql-server oracle postgresql
实际答案是“视情况而定”,没有绝对的答案。
基本标准是它必须是一个可更新的视图在数据库引擎看来,也就是说引擎可以唯一地识别要更新的行,其次是字段可更新。如果您的视图具有计算字段或表示父/子联接的乘积,则默认答案可能为否。
然而,它也有可能作弊......在 MS SQL Server 和 Oracle(仅举两个例子)中,您可以在尝试插入或更新视图时触发触发器,这样您就可以制作服务器没有的东西'认为可更新的东西 - 通常是因为您知道服务器不能轻易地从架构中推断出来。
【讨论】:
INSTEAD OF 触发器来处理视图上的插入、更新和删除。
正确答案是“视情况而定”。例如,您不能更新视图中的聚合列。对于 Oracle 视图,您可以在 Google 上搜索“可更新连接视图”,了解何时可以更新视图以及何时不能更新视图的一些示例。
【讨论】:
是的,它们是可更新的,但并非总是如此。可以在以下情况下更新视图:
如果视图包含创建视图所基于的表的主键。
如果视图是基于一个且仅一个表定义的。
【讨论】:
PostgreSQL 有创建可更新视图的规则。查看the examples in the manual 了解如何使用它们。
附言。在 PostgreSQL 中,一个 VIEW 是一个规则,一个选择规则。
【讨论】:
过去无法更新任何视图。视图的主要目的是查看数据,因此得名。它也可以称为存储查询。
如今,许多数据库引擎都支持更新视图。它受到限制,某些更新几乎是不可能的(例如,计算列、分组依据等)。
【讨论】:
有两种方法:
INSTEAD OF 触发器,基本上将问题转移给用户。你编写一些程序代码来完成这项工作。当然,不保证正确性、一致性等。从 RDBMS 引擎的角度来看,从基表中删除所有内容的触发器,无论在视图中进行什么更新,都非常好。
更具雄心的是由 RDBMS 引擎专门处理的视图更新。这里没有太大进展:说得委婉一点,如果你有一些好的想法,那么你可以推出博士论文。在实践中,您最喜欢的 RDBMS 可能会允许一些限制性的临时视图更新;检查手册:-)
【讨论】:
是的,您可以,但请查看CREATE VIEW (Transact-SQL) 并查看可更新视图
部分【讨论】:
【讨论】:
是的 - 语法与更新表相同
Update MyView
Set Col1 = "Testing"
Where Col2 = 3
Go
创建可更新的视图有几个条件。他们可以找到here
编辑:
我必须补充的是基于 MS SQL 的
【讨论】:
go?除了 SSMS,我认为它不是一个有效的 sql 构造。 :)
在 SQL Server 中创建视图时,所引用表列(列名和序号位置)的元数据将持久保存在数据库中。对引用的基表的任何更改(列重新排序、新列添加等)都不会反映在视图中,直到视图是:
•使用 ALTER VIEW 语句进行更改 •使用 DROP VIEW/CREATE VIEW 语句重新创建 •使用系统存储过程sp_refreshview刷新
【讨论】:
是的,使用INSTEAD OF 触发器。
【讨论】:
我们通常不会更新视图。编写一个视图以根据连接和放置条件从各种表中获取数据。
视图只是一个逻辑,它在调用它时提供所需的数据集。
但不确定在什么情况下需要更新视图。
【讨论】: