【问题标题】:I try adding a ROW to a VIEW, but it does not appear in it, yet it does in the TABLEthe view was created from我尝试将 ROW 添加到 VIEW,但它没有出现在其中,但它在 TABLE 中出现了视图是从
【发布时间】:2019-06-06 03:27:07
【问题描述】:

提供了一张员工表 table1,我必须创建一个视图,列出担任管理职位的员工。没问题。 然后从这个角度必须列出属于部门 10 的人。没问题。 但是,仍然是同样的观点,我被要求插入一个属于 20 部门的新推销员。 执行此操作时,新创建的行不会出现在视图中,但会出现在原始 table1 中。我不懂为什么。这是我的代码:

-- I create the view here

create view v_senior 
as
select *
from emp
where job like 'manager' or job like 'president';

--Here I filter by department 10

select *
from v_senior
where deptno = 10;


-- Here I try to add the new Salesman

insert into v_senior (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(8888,'Luxian', 'SALESMAN', '5678', '2019-06-06', '100000', '500', 20)

这就是当我尝试从 v_senior 获取所有数据时,返回的唯一数据是处于管理职位的员工,没有我新添加的销售员的迹象。但是当我从 emp (原始表)中获取所有数据时,这个推销员确实出现了。请任何人为我解释一下,我感到迷茫,不知道出了什么问题。 非常感谢。

【问题讨论】:

  • 您的视图有一个 WHERE 条件来限制基于“经理”或“总裁”的数据,但您正在插入一个“推销员”工作,因此它不会成为视图的一部分。它按预期工作。为什么你认为它应该是其他的?
  • 如果您的查询只是在寻找“经理”或“总裁”的工作,为什么您希望看到没有该值的行?
  • 我认为 WHERE 语句只会追溯,但它确实会影响任何新添加的行?我将它直接添加到视图中,而不是添加到表格中,但它出现在表格中。无论如何,谢谢你的回答。
  • @OldProgrammer 感谢您的回答,但我只是按照作业表上的步骤进行操作。以下是列出的步骤 1.2 使用在 1.1 中创建的视图来: 1.2.1 列出部门 10 中的所有高级员工。 1.2.2 将新销售员插入部门 20。 1.2.3 列出所有高级员工。
  • “我认为 WHERE 语句只能追溯”——不。视图或多或少是一个存储查询,每次查询视图时都会重新执行。 “但它会影响任何新添加的行吗?”是的。

标签: sql database


【解决方案1】:

由于视图中的过滤条件,您的视图正在过滤掉新数据。

由于这是一个家庭作业问题,我假设讲师可能要求您直接在 EMP 表中插入不匹配的行并观察它在视图中不可见(这就是视图的用途)。但是您通过在视图中插入发现了一个更有趣的案例,这种“消失的行”行为是众所周知的现象。

您可以轻松防止“消失的行”行为:

create view v_senior
as
select *
from emp
where job like 'manager' or job like 'president'
with check option;

with check option 位告诉 Oracle 验证您使用视图所做的任何更改(INSERTS 或 UPDATES)在查询视图时仍然可见。 此功能的存在是为了防止您遇到类似的情况。

这是一个可选功能,如果不启用它,你会时不时看到“消失的行”的问题。

使用新视图,我做了一个(稍作修改)插入:

insert into v_senior (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(8888,'Luxian', 'SALESMAN', '5678', DATE'2019-06-06', '1000', '500', 20)

得到了这个错误:

ORA-01402:查看 WITH CHECK OPTION where-clause 违规

这是意料之中的。

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2015-11-25
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多