【问题标题】:In Oracle, is it possible to INSERT or UPDATE a record through a view?在 Oracle 中,是否可以通过视图插入或更新记录?
【发布时间】:2010-12-11 19:11:22
【问题描述】:

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

【问题讨论】:

  • 我的意思是记录。我编辑了问题。

标签: sql oracle plsql views


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Oracle 有两种不同的方式使视图可更新:-

    1. 对于您尝试更新的内容,该视图已“保留密钥”。这意味着基础表的主键在视图中,并且该行在视图中只出现一次。这意味着 Oracle 可以准确地确定要更新的基础表行或
    2. 您编写了一个代替触发器。

    我会远离而不是触发器,让您的代码直接更新基础表,而不是通过视图。

    【讨论】:

    • 这两个条件之间是否存在andor? (对我来说,这听起来像是两个不同的想法..
    【解决方案3】:

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

    来自Oracle 10g SQL Reference

    关于可更新视图的说明

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

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

    • 视图中的每一列都必须映射到单个表的一列。例如,如果视图列映射到 TABLE 子句(未嵌套的集合)的输出,则视图本质上是不可更新的。
    • 视图不得包含以下任何构造:
      • 集合运算符
      • DISTINCT 运算符
      • 聚合或分析函数
      • GROUP BY、ORDER BY、MODEL、CONNECT BY 或 START WITH 子句
      • SELECT 列表中的集合表达式
      • SELECT 列表中的子查询
      • 指定为只读的子查询
      • 加入,但有一些例外,如 Oracle 数据库管理员指南中所述

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

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

    • DML 语句必须只影响连接下的一张表。
    • 对于 INSERT 语句,不能使用 WITH CHECK OPTION 创建视图,并且插入值的所有列都必须来自保留键的表。保留键的表是指基表中的每个主键或唯一键值在连接视图中也是唯一的。
    • 对于 UPDATE 语句,所有更新的列都必须从保留键的表中提取。如果视图是使用 WITH CHECK OPTION 创建的,则连接列和取自在视图中多次引用的表中的列必须与 UPDATE 隔离。
    • 对于 DELETE 语句,如果连接产生多个保留键的表,则 Oracle 数据库将从 FROM 子句中命名的第一个表中删除,无论视图是否是用 WITH CHECK OPTION 创建的。

    【讨论】:

      【解决方案4】:

      有两种情况可以通过视图更新记录:

      1. 如果视图没有连接或过程调用并从单个基础表中选择数据。
      2. 如果视图有一个与视图关联的INSTEAD OF INSERT trigger

      一般来说,除非您专门为它编写了 INSTEAD OF 触发器,否则您不应依赖于能够对视图执行插入操作。请注意,还可以编写 INSTEAD OF UPDATE 触发器来帮助执行更新。

      【讨论】:

      • 基本正确,但在某些情况下可以更新连接视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多