【问题标题】:Cannot modify a column which maps to a non key-preserved table?无法修改映射到非键保留表的列?
【发布时间】:2025-12-24 00:00:11
【问题描述】:

我正在尝试运行一个简单的更新命令来从这个 emp 视图更改基表。但是我收到了这个我以前从未见过的错误消息,我不太明白它在说什么。如果需要,我可以提供任何其他信息。

UPDATE emp_view_updt SET deptno = 30 WHERE empno = 7369;

这里是emp_view_updt的定义:

CREATE VIEW emp_view_updt as SELECT e.empno, e.ename, e.job, d.deptno, DECODE (d.deptno, 10, 'New York', 20, 'Dallas', 30, 'Chicago', 40, 'Boston') as loc FROM emp e INNER JOIN dept d ON e.deptno = d.deptno;

以下是列和数据类型:

视图如下所示:

【问题讨论】:

标签: sql oracle oracle-apex


【解决方案1】:

我相信您缺少参照完整性约束(可能还有主键)。确保deptnodept 的主键,并添加从empdept 的外键约束,更新应该可以工作。这允许数据库推断视图中的每个结果都映射到 dept 中的不同行。

update (select e.empno, e.ename, e.job, d.deptno
        from emp e inner join dept d on e.deptno = d.deptno)
set deptno = 30 where empno = 7369;

ORA-01779: cannot modify a column which maps to a non key-preserved table

alter table dept add constraint dept_pk primary key (deptno);

alter table emp add constraint emp_dept_fk foreign key (deptno) references dept (deptno);

update (select e.empno, e.ename, e.job, d.deptno
        from emp e inner join dept d on e.deptno = d.deptno)
set deptno = 30 where empno = 7369;

1 row(s) updated.

https://livesql.oracle.com/apex/livesql/s/hm2ybpb8hnjoplqmdfoa4sb56

【讨论】: