今天遇到一个错误:ORA-01779:无法修改与非键值保存表对应的列。
后来发现,当要对一个基于多表连接的视图进行插入,更新等操作时,容易出现这个错误。
解决办法:个人认为,这个视图不能操作,可以对它基于的表进行操作,这样,该视图里也就有相应数据了。
于是,做了下面这个实验。
SQL> create table emp2 as select * from emp;
表已创建。
SQL> alter table emp2 add constraint pk_emp2 primary key(empno);
表已更改。
SQL> select constraint_name,constraint_type
2 from user_constraints
3 where table_name='EMP2';
CONSTRAINT_NAME C
------------------------------ -
PK_EMP2 P
建基于emp2,dept的视图emp2_view
SQL> create view emp2_view as select empno,ename,dept.deptno
2 from emp2,dept
3 where emp2.deptno=dept.deptno;
视图已创建。
试图往这个试图里面插入数据:
SQL> insert into emp2_view(deptno) values(40);
insert into emp2_view(deptno) values(40)
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
SQL> insert into emp2(deptno) values(40);
insert into emp2(deptno) values(40)
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP2"."EMPNO")
对它基于的表进行操作
SQL> insert into emp2(empno,deptno) values(111,40); --注意:前提是emp2,dept里面必须都有deptno为40这个值。否则,查看视图时,看不到这条记录。
已创建 1 行。
现在,对这个视图进行查看,就能看到数据了。
SQL> select * from emp2_view where deptno=40;
EMPNO ENAME DEPTNO
---------- ---------- ----------
111 40