zoukankan      html  css  js  c++  java
  • ORA-01779: 无法修改与非键值保存表对应的列

    项目中通过子查询更新数据时遇到ORA-01779: 无法修改与非键值保存表对应的列,模拟过程如下:

    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表数据时才有意义,

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

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

  • 相关阅读:
    搭建基于nginx-rtmp-module的流媒体服务器
    mysql length和char_length
    mediainfo使用
    linux下ftp服务器搭建
    排序算法
    设计模式之注册树模式
    dock
    linux下安装使用tar
    linux下安装rar
    linux 内存操作相关命令
  • 原文地址:https://www.cnblogs.com/lgx5/p/11876786.html
Copyright © 2011-2022 走看看