在Oracle中,是否可以通过视图插入或更新记录?

时间:2009-10-31 00:46:18

标签: sql oracle plsql views

在Oracle中,是否可以通过视图插入或更新记录(一行)?

4 个答案:

答案 0 :(得分:42)

Oracle 中的视图可能在特定条件下可更新。这可能很棘手,通常是不可取的。

来自Oracle 10g SQL Reference

有关可更新视图的说明

可更新视图是可用于插入,更新或删除基表行的视图。您可以创建一个本质上可更新的视图,或者您可以在任何视图上创建一个INSTEAD OF触发器以使其可更新。

要了解是否可以修改固有可更新视图的列以及以何种方式修改,请查询USER_UPDATABLE_COLUMNS数据字典视图。此视图显示的信息仅对固有可更新视图有意义。要使视图具有固有的可更新性,必须满足以下条件:

  • 视图中的每个列都必须映射到单个表的列。例如,如果视图列映射到TABLE子句(未引入的集合)的输出,则视图本身不可更新。
  • 视图不得包含以下任何构造:
    • 设置运算符
    • 一个DISTINCT运营商
    • 汇总或分析功能
    • GROUP BY,ORDER BY,MODEL,CONNECT BY或START WITH子句
    • SELECT列表中的集合表达式
    • SELECT列表中的子查询
    • 指定为WITH READ ONLY的子查询
    • 加入,但有一些例外情况,如“Oracle数据库管理员指南”中所述。

此外,如果固有可更新视图包含伪列或表达式,则无法使用引用任何这些伪列或表达式的UPDATE语句更新基表行。

如果希望连接视图可更新,则必须满足以下所有条件:

  • DML语句必须仅影响联接的一个表。
  • 对于INSERT语句,不能使用CHECK OPTION创建视图,并且插入值的所有列必须来自密钥保留表。密钥保留表是基表中的每个主键或唯一键值在连接视图中也是唯一的。
  • 对于UPDATE语句,必须从保留密钥的表中提取更新的所有列。如果视图是使用CHECK OPTION创建的,那么连接列和从视图中多次引用的表中获取的列必须屏蔽UPDATE。
  • 对于DELETE语句,如果连接导致多个密钥保留表,则Oracle数据库将从FROM子句中指定的第一个表中删除,无论该视图是否使用CHECK OPTION创建。

答案 1 :(得分:10)

Oracle有两种不同的方法可以更新视图: -

  1. 对于您要更新的内容,视图是“密钥保留”。这意味着基础表的主键位于视图中,并且该行仅在视图中出现一次。这意味着Oracle可以确切地确定要更新的基础表行OR
  2. 你写了一个而不是触发器。
  3. 我会远离反向触发器并让你的代码直接更新底层表而不是通过视图。

答案 2 :(得分:4)

有两次可以通过视图更新记录:

  1. 如果视图没有连接或过程调用,则从单个基础表中选择数据。
  2. 如果视图与视图关联INSTEAD OF INSERT trigger
  3. 通常,您不应该依赖于能够对视图执行插入操作,除非您专门为其编写了INSTEAD OF触发器。请注意,还可以编写INSTEAD OF UPDATE触发器以帮助执行更新。

答案 3 :(得分:0)

,您可以更新并插入到视图中,编辑将反映在原始表 .... 的 BUT
1 - 视图应该包含表格中的所有 NOT NULL 值 2 - 更新应该具有与表相同的规则 ...“更新与其他外键相关的主键等...”