【问题标题】:If I update a view, will my original tables get updated如果我更新视图,我的原始表格会更新吗
【发布时间】:2011-02-08 13:24:37
【问题描述】:

假设我有两张表 Employee 和 Locations。另外,我有一个 viewEmpLocation 视图,它是通过加入 Employee 和 Locations 生成的。

如果我更新视图,原始表中的数据会更新吗?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql views


    【解决方案1】:

    Using Views in Microsoft SQL Server

    通过视图修改数据时 (即使用 INSERT 或 UPDATE 声明)存在某些限制 取决于视图的类型。意见 访问多个表只能 修改视图中的表之一。 使用函数的视图,指定 DISTINCT,或使用 GROUP BY 条款可能不会更新。 此外,插入数据是 禁止用于以下类型 意见:

    * views having columns with derived (i.e., computed) data in the SELECT-list  
    * views that do not contain all columns defined as NOT NULL from the tables from which they were defined
    

    也可以插入或 通过视图更新数据,使得 数据不再可以通过 该视图,除非 WITH CHECK 已指定 OPTION。

    【讨论】:

    • 通过视图插入有很多注意事项,我个人觉得直接插入表格更简单。毕竟,你还是得查查什么字段到什么表才能符合规则,如果你知道没有理由不直接更新或插入表。
    • 我实际上从未对视图执行过 UPDATE 或 INSERT,但如果您有一个可用于快速定位需要更改的行的索引视图,它可能会对您有所帮助。在这种情况下,我会为更新的唯一目的构建视图。
    【解决方案2】:

    是的。

    视图中的数据不存在独立于组成视图的表。视图本质上是一个伪装成表的存储 SELECT 语句。数据存储在原始表中,只有在您想要查看时才“组装”到视图中。如果视图是可更新的(并非所有视图都是),则更新将应用于表数据。

    【讨论】:

    • 我明白你的意思。但是出现了一个新的问题,如果视图只是一个选择语句,那么索引是如何在视图上维护的。一旦有人查询视图,所有索引都会重建吗?
    • 视图上没有索引,只有基础表上。当您从视图请求数据时,DBMS 使用索引来组装来自不同表的行。 (这忽略了一种相当新的视图,即“物化视图”,数据库在其中存储数据的“影子”副本,有效地为您预先计算视图)。
    【解决方案3】:

    您可以在视图上使用触发器对实际表执行插入/更新/删除操作。

    http://www.devarticles.com/c/a/SQL-Server/Using-Triggers-In-MS-SQL-Server/1/

    【讨论】:

    • 感谢对我的回答的反馈,但如果它是否定的,为什么没有人评论?如果有错误,我希望得到纠正。
    • 这个问题明确询问了更新视图的效果。提出替代方案固然很好,但它并不能回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多