【问题标题】:Is a view in the database updatable?数据库中的视图是否可更新?
【发布时间】:2011-04-16 05:29:50
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server oracle postgresql


    【解决方案1】:

    实际答案是“视情况而定”,没有绝对的答案。

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

    然而,它也有可能作弊......在 MS SQL Server 和 Oracle(仅举两个例子)中,您可以在尝试插入或更新视图时触发触发器,这样您就可以制作服务器没有的东西'认为可更新的东西 - 通常是因为您知道服务器不能轻易地从架构中推断出来。

    【讨论】:

    • “视情况而定” - 数据库专业人士最喜欢的答案。 8-)
    • 作为一名“程序员”已有太多年了,与客户/用户进行了太多对话,其中可以用零和一表示的好答案很少而且相差甚远(-:
    • 在 Oracle 中,您也可以创建 INSTEAD OF 触发器来处理视图上的插入、更新和删除。
    • @Jeffrey - 添加了对 oracle 和 MS SQL 的引用,以表明它不仅仅是一个具有适当触发器的数据库(自从我做任何 Oracle 工作以来已经过去了十年的大部分时间)。我不会添加更多 - 希望很明显该列表不是排他性的!
    【解决方案2】:

    正确答案是“视情况而定”。例如,您不能更新视图中的聚合列。对于 Oracle 视图,您可以在 Google 上搜索“可更新连接视图”,了解何时可以更新视图以及何时不能更新视图的一些示例。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        PostgreSQL 有创建可更新视图的规则。查看the examples in the manual 了解如何使用它们。

        附言。在 PostgreSQL 中,一个 VIEW 是一个规则,一个选择规则。

        【讨论】:

          【解决方案5】:

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

          如今,许多数据库引擎都支持更新视图。它受到限制,某些更新几乎是不可能的(例如,计算列、分组依据等)。

          【讨论】:

            【解决方案6】:

            有两种方法:

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

            2. 更具雄心的是由 RDBMS 引擎专门处理的视图更新。这里没有太大进展:说得委婉一点,如果你有一些好的想法,那么你可以推出博士论文。在实践中,您最喜欢的 RDBMS 可能会允许一些限制性的临时视图更新;检查手册:-)

            【讨论】:

              【解决方案7】:

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

              部分

              【讨论】:

                【解决方案8】:

                【讨论】:

                  【解决方案9】:

                  是的 - 语法与更新表相同

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

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

                  编辑:

                  我必须补充的是基于 MS SQL 的

                  【讨论】:

                  • 为什么是go?除了 SSMS,我认为它不是一个有效的 sql 构造。 :)
                  • @Denis - 谢谢!我刚刚意识到 OP 已经标记了问题 Oracle & PostgreSQL。哎呀
                  • 我相信您的查询也可以在其他系统中正常工作。
                  【解决方案10】:

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

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

                  【讨论】:

                  • 这个答案好像是直接从here复制过来的。
                  【解决方案11】:

                  是的,使用INSTEAD OF 触发器。

                  【讨论】:

                    【解决方案12】:

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

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

                    但不确定在什么情况下需要更新视图。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-06-04
                      • 1970-01-01
                      • 2015-08-02
                      • 1970-01-01
                      • 2012-05-29
                      • 2021-12-17
                      • 1970-01-01
                      相关资源
                      最近更新 更多