在 Oracle 中使用 set 命令更新视图

Posted

技术标签:

【中文标题】在 Oracle 中使用 set 命令更新视图【英文标题】:Updating views using set command in Oracle 【发布时间】:2013-03-27 13:33:28 【问题描述】:

我正在尝试自学 SQL,但遇到了困难。

我正在使用 Oracle 提供的标准演示表 (seen here)。

假设我创建了两个相同的视图:

create view view_a_emp as
select empno, ename, job
from emp
where job = 'CLERK';

create view view_b_emp as
select empno, ename, job
from emp
where job = 'CLERK';

我将为每个返回 4 行。

如果我更新 view_b_emp,像这样:

update view_b_emp
set job = 'ASSISTANT';

现在两个视图都没有返回任何行,并且基础基表已被修改(所有“文员”现在都是“助理”)。

很明显,我误解了视图的工作原理,但我认为视图的想法是提供一个虚拟表。

谁能解释为什么在一个视图上更新和设置属性会改变基础表?

【问题讨论】:

阅读浏览量:docs.oracle.com/cd/E11882_01/server.112/e25789/… 【参考方案1】:

这就是它的工作原理!视图只不过是存储的查询。

如果您希望防止对视图的更新与视图的定义发生冲突,可以将with check option 添加到视图中。

见http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_8004.htm#SQLRF54792

【讨论】:

我将在这个问题上分心,因为理解这一点至关重要。视图只是您可以调用的查询,它并没有像 Oracle 缓存它那样存储。例如,如果您有一个长时间运行的查询作为视图的一部分,Oracle 将每次都执行该查询,而不是像在 materialized view 中那样存储结果 感谢您的澄清,伙计们。我以为我要疯了。【参考方案2】:

因为它链接到基础表,修改表视图将修改其基础表。 http://www.informit.com/articles/article.aspx?p=130855&seqNum=4

【讨论】:

以上是关于在 Oracle 中使用 set 命令更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g 中数据库视图的更新频率

Oracle 基础——视图

在 Oracle 视图中更新数据

Oracle:在可更新视图上插入

Oracle数据库——索引视图序列和同义词的创建

oracle通过视图修改实际表怎么防止视图同步更新