ORA-01779: 无法修改与非键值保存表对应的列,bug

本文探讨了在通过视图更新Oracle数据库时遇到的ORA-01779错误。错误源于试图更新视图中来自维度表而非事实表的列。文章详细解释了如何通过调整视图定义来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"ORA-01779: 无法修改与非键值保存表对应的列"问题

(2009-09-21 14:04:53)
标签:

it

分类:计算机

这几天在一个老生产系统中出现了一个问题,在修改数据的时候报错:

 

no changes made to database

insert into "xxxxx"("id","c1","c2",c3,c4,c5) values(:1,:2,:3,:4,:5,:6)

 

经过排查发现是系统通过一个view修改一张表的时候出现这个错误,该view是通过三张表t1,t2,t3关联而成的:

select a.id,a.c1,a.c2,a.c3.a.c4,a.c5,b.vv,c.gh

from t1 a,t2 b,t3 c

where a.moid=b.moid and a.cdid=c.cdid

 

造成这个错误的原因是更新的列不是事实表的列,而是维度表的列。换句话说,如果view是几张表关联而成的,在关联中关联字段是主键的表是维度表,维度表形成的列是不能进行更新的,如上的vv和gh列,如果更新语句涉及了这些列,就会出现ORA-01799错误;而关联字段不是表主键的表就是事实表,事实表形成的列就是可更新的。如果是两张表的主键字段进行关联,那么无论通过view都可以更新这2张表的字段。

进过排查,发现上面的view中的where语句里面cdid既不是a的主键也不是c的主键,造成a表的所有字段都不是可以进行跟新的,程序的原意是要通过view跟新a表的,因此将a.cdid=c.cdid更改成c表的主键bid就行了:

a.bid=c.bid

 

总结:在通过view修改基表的情况一定要注意生成view的语句关联字段的书写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值