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

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


  1. <span style="font-size:18px;">项目中通过子查询更新数据时遇到<span style="color:rgb(255,0,0);">ORA-01779: 无法修改与非键值保存表对应的列</span>,模拟过程如下:</span>  

1、创建测试表

  1. CREATE TABLE tt1 (ID INT,col1 VARCHAR2(20));  
  2. CREATE TABLE tt2 (ID INT,cola VARCHAR2(20));  

2、录入测试数据

  1. INSERT INTO tt1 VALUES(1,'tt1id1');  
  2. INSERT INTO tt1 VALUES(2,'tt1id2');  
  3. INSERT INTO tt2 VALUES(1,'tt2id1');  
  4. INSERT INTO tt2 VALUES(2,'tt2id2');  
  5. INSERT INTO tt1 VALUES(3,'tt1id3');  
  6. INSERT INTO tt2 VALUES(4,'tt2id4');  
  7. COMMIT;  
3、执行更新
  1. UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE  tt1.ID=tt2.ID)  
  2. SET col1=cola;  
      报错:ORA-01779: 无法修改与非键值保存表对应的列

4、分析

      根据错误提示:”无法修改与非键值保存表对应的列”,初步推断为tt2中没有主键?

      那么在tt2上添加主键后再更新试试

  1. ALTER TABLE tt2 ADD CONSTRAINT pk_tt2_id PRIMARY KEY(ID);  
  2.   
  3. UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE  tt1.ID=tt2.ID)  
  4. SET col1=cola;  
      发现可以成功更新数据。

      然后将在tt2上加的主键删除,再在tt1上添加主键试试, 

  1. ALTER TABLE tt2 DROP CONSTRAINT pk_tt2_id;  
  2. ALTER TABLE tt1 ADD CONSTRAINT pk_tt1_id PRIMARY KEY(ID);  
      再执行第3 步中的更新语句,发现还是报错:ORA-01779: 无法修改与非键值保存表对应的列

5、结论:

      用A表去更新B表的数据,A表的关联条件必须为主键,Oracle这样做的目的是保证表A的满足关联条件的数据是唯一的,

      这样在更新B表数据时才有意义(自己都不确定怎么影响别人,是吧,hehe),

      当然,如果两表关联的字段都为主键,则无论谁更新谁都没有问题。

      结论:用A表数据更新B表数据,则A与B的对应关系为:1:1 或 1:n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值