我尝试将ROW添加到VIEW,但未在其中显示,但在TABLE中确实如此。

时间:2019-06-05 19:00:26

标签: sql database

提供了一个雇员表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(原始表)中获取所有数据时,就会出现该推销员。请问有人给我一个解释,我不知道出了什么问题,感到迷茫。 非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

create view v_senior
as
select *
from emp
where job like 'manager' or job like 'president'
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:使用检查选项查看子句违反情况

这是预期的。