项目中通过子查询更新数据时遇到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. 盘点当下大热的7大Github机器学习创新项目

    哪个平台有最新的机器学习发展现状和最先进的代码?没错——Github!本文将会分享近期发布的七大GitHub机器学习项目.这些项目广泛覆盖了机器学习的各个领域,包括自然语言处理(NLP).计算机视觉. ...

  2. ELK日志系统之kibana的使用操作

    1.ELK日志系统打开后,打开kibana的操作界面,第一步创建索引模式: 第2步:创建日志索引 第3步:创建成功 第4步:查看30分钟时间段内的日志数据,也可以查今天的,今月的,今年的 放牛去

  3. YUM方式安装MYSQL5.7

    首先mysql官网下载yum源https://dev.mysql.com/downloads/repo/yum/ 然后将下载好的rpm文件安装并校验 [root@elegant-snap-3 /sta ...

  4. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案

    运行环境:Spring框架整合MaBitis框架 问题叙述: 在Spring配置文件applicationContext-mybatis.xml中配置好mybatis之后 <?xml versi ...

  5. Nginx 核心配置-自定义日志路径及清空日志注意事项

    Nginx 核心配置-自定义日志路径及清空日志注意事项 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关于日志清空注意事项 1>.nginx服务写访问日志是基于acces ...

  6. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

  7. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  8. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,升级流程源码详细说明

    前言 1.BootLoader程序,升级简要流程图 2.其实主要的就是把程序文件写入环形队列,然后环形队列取出来数据写入Flash 3.用户程序,简要流程图 下面的读一下,有个印象就可以: 说白了就是 ...

  9. selenium--高亮显示正在操作的元素

    前戏 在进行web自动化的时候,如果我们想知道正在操作的元素,我们可以通过js的方式来实现 实战 from selenium import webdriver import unittest, tim ...

  10. [TJOI2009]猜数字(洛谷 3868)

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...