Oracle视图更新条件——Key-Preserved Tables(ORA-01779: 无法修改与非键值保存表对应的列)

上周在做视图更新的时候,报了一个错:ORA-01779: 无法修改与非键值保存表对应的列。为了解决这个问题,浏览了很多人的博客,大多数都只是举了一个例子,而没有说出本质问题在哪,不如看官方文档更加清晰透彻。只有这篇博客非常深入地探讨了这个问题,大家可以阅读一下:从ORA-01752的错误,透过现象看本质

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

解决这个问题的关键在于搞清楚什么是Key-Preserved Tables?

Oracle视图更新条件——Key-Preserved Tables(ORA-01779: 无法修改与非键值保存表对应的列)_第1张图片

上面是官方文档的解释。大致意思: 搞清楚key-preserved table 是理解多表连接视图更新条件的基础。一个表如果是key-preserved表,那么满足的条件是:它的每一个主键(或唯一键)同样是该视图的主键(或唯一键)。所以,一个key-preserved表它的主键(或唯一键)会在连接多表后被保留下来。

如果把emp和dept通过emp.deptno=dept.deptno连接,那么结果是:

Oracle视图更新条件——Key-Preserved Tables(ORA-01779: 无法修改与非键值保存表对应的列)_第2张图片

在上面这个视图中,emp是key-preserved表,因为empno是emp表的主键,同样也是连接结果的主键。但是dept表不是key-preserved表,因为deptno虽然是dept表的主键,但它不是连接结果的主键。

所以,若尝试修改连接结果中的dept表的字段时,会报ORA-01779: 无法修改与非键值保存表对应的列:

 而修改emp表的字段,则会成功:

 

 由于好奇,我又尝试了其他不同的限制,然后就出现了令人疑惑的现象:

Oracle视图更新条件——Key-Preserved Tables(ORA-01779: 无法修改与非键值保存表对应的列)_第3张图片

我只是在连接条件后面加了数值,emp就变成了非 key-preserved表。难道key-preserved表一定要连接条件是自然连接或自连接、外连接?

你可能感兴趣的:(Oracle视图更新条件——Key-Preserved Tables(ORA-01779: 无法修改与非键值保存表对应的列))