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

1、创建测试表

    CREATE TABLE tt1 (ID INT,col1 VARCHAR2());
CREATE TABLE tt2 (ID INT,cola VARCHAR2());

2、录入测试数据

    INSERT INTO tt1 VALUES(,'tt1id1');
INSERT INTO tt1 VALUES(,'tt1id2');
INSERT INTO tt2 VALUES(,'tt2id1');
INSERT INTO tt2 VALUES(,'tt2id2');
INSERT INTO tt1 VALUES(,'tt1id3');
INSERT INTO tt2 VALUES(,'tt2id4');
COMMIT;

3、执行更新

    UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE  tt1.ID=tt2.ID)
SET col1=cola;

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

4、分析

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

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

    ALTER TABLE tt2 ADD CONSTRAINT pk_tt2_id PRIMARY KEY(ID);

    UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE  tt1.ID=tt2.ID)
SET col1=cola;

发现可以成功更新数据。

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

    ALTER TABLE tt2 DROP CONSTRAINT pk_tt2_id;
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。

ORA-01779: 无法修改与非键值保存表对应的列的更多相关文章

  1. SharedPreferences使用(通过键值保存数据)

    保存数据到SharedPreferences中 要想使用SharedPreferences来存储数据, 首先需要获取到SharedPreferences对象. Android中主要提供了三种方法用于得 ...

  2. android sp文件一个键值保存多条信息

    之前碰到过这样的问题,sp文件只能够append,或者清空.其实一个键值,通过,分割,或者替代可以实现多条信息的存储.下面是一个举例: package com.ctbri.weather.utils; ...

  3. 后台返回的json数据,前台需要修改对象的键值名,重新修改数据格式

    //例如,后台返回的数据为: var json = { data: [   {value: 103.95, name: "法拉利"}, {value: 103.2, name: & ...

  4. Learning Spark中文版--第四章--使用键值对(1)

      本章介绍了如何使用键值对RDD,Spark中很多操作都基于此数据类型.键值对RDD通常在聚合操作中使用,而且我们经常做一些初始的ETL(extract(提取),transform(转换)和load ...

  5. Unity键值(KeyCode)

    Unity的Input管理 keyCode示例 keyCode Demo function OnGUI(){ var e:Event=Event.current; if(e.isKey){ Debug ...

  6. Oracle复合B*tree索引branch block内是否包含非先导列键值?

    好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch b ...

  7. 一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值

    一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户.某时间.对某表.某主键.某字段的修改(新旧值). 特别适用于订单历史记录.重要财务记录.审批流记录 表设计: names ...

  8. 通过程序修改注册表键值来达到修改IE配置参数的目的

    通过程序修改注册表键值来达到修改IE配置参数的目的 使用IE访问应用程序或网页时经常需要设置一些选项(工具-Internet 选项),比如为了避免缓存网页,把工具-Internet选项-常规选项卡-I ...

  9. eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?

    eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...

随机推荐

  1. 【团队项目1】 团队展示&选题

    一.团队展示 1. 队名:这次稳了 2. 队员: 莫少政 3117004667 (队长) 黄思扬 3117004657 余泽端 3117004679 江海灵 3117004658 温治乾 311700 ...

  2. Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)

    备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...

  3. 混合高斯模型(Gaussian mixture model, GMM)

    1. 前言 这就是为什么我要学习一下二维高斯分布的原因: 总感觉数学知识不够用呐,顺带把混合高斯模型也回顾一下. 2. 单高斯模型(Gaussian single model, GSM) 2.1 一维 ...

  4. 201871010107-公海瑜《面向对象程序设计(Java)》第四周学习总结

       201871010107-公海瑜<面向对象程序设计(Java)>第四周学习总结          项目                                         ...

  5. C#的介绍

    C#是一种面向对象的.运行于.net框架上的一种高级程序设计语言. 它的优点在于简单,类型安全,垃圾回收器自动回收内存,封装了许多常用的类,适合快速开发. 它的缺点在于依赖.net框架,跨平台支持有限 ...

  6. Python并发编程之进程同步

    """ 问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱的问题 """ ''' 进程同步 ''' #多进程抢占输出资源 ...

  7. Kinect v2控制鼠标原理分析和源码

    https://blog.csdn.net/baolinq/article/details/54381284 此程序为利用Kinect v2实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那 ...

  8. 原题链接在这里:980. Unique Paths III

    原题链接在这里:https://leetcode.com/problems/unique-paths-iii/ 题目: On a 2-dimensional grid, there are 4 typ ...

  9. webpack中的hash、chunkhash、contenthash区别

    hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CD ...

  10. 【BigData】Java基础_ArrayList的使用

    ArrayList概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. 数组有自身的特点,不变性,一旦数组被初始化,那么其长度就固定了,不 ...