项目中通过子查询更新数据时遇到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. 虚拟机配置静态ip

    参考地址  https://www.cnblogs.com/maowenqiang/articles/7727910.html TYPE=EthernetBOOTPROTO="static& ...

  2. MYSQL入门操作和常规DML、DDL、DQL使用

    刷新权限,将某些权限从硬盘刷新到内存中(修改root密码自带隐式刷新权限操作) mysql> flush privileges; Query OK, 0 rows affected (0.00 ...

  3. Tomcat9在CentOS7上启动慢解决办法,实测可行

    1.修改jdk目录下的java.security文件 vim /usr/lib/jvm/jdk1.8.0/jre/lib/security/java.security 将如下配置securerando ...

  4. Java--8--新特性--串并行流与ForkJoin框架

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流.穿行流则相反,并行流的底层其实就是ForkJoin框架的一个实现. 那么先了解一下ForkJoin框架吧. Fork/Join ...

  5. Linux Tomcat安装及端口配置

    1.  JDK安装配置 待写 2. Tomcat安装配置 1,下载Tomcat链接,到启动测试. 将文件apache-tomcat-8.5.50.tar.gz移动到/usr/tomcat/下,并解压 ...

  6. TL-WDN5200H无线usb网卡在Linux上的使用

    买了个TL-WDN5200H无线usb网卡,但是发现它居然不支持Linux,但是我有时需要在Linux上使用,这就尴尬了.于是到网上搜索资料,终于解决了这个问题. 首先编译安装:https://git ...

  7. C++小工具

    1.Doxygen 从源代码生成文档.可以生成在线文档(HTML)和离线手册(以LATEX格式),还可以自动生成各种依赖关系图,继承关系图等.

  8. Eslint 允许使用双等号

    资料 网址 ESlint: Expected !== and instead saw != https://stackoverflow.com/questions/48375316/eslint-ex ...

  9. Kubernetes部署Spring Boot应用

    SpringBoot项目 新建springboot项目 @RestController public class HelloWorldController { @RequestMapping(&quo ...

  10. Scrapy笔记09- 部署

    Scrapy笔记09- 部署 本篇主要介绍两种部署爬虫的方案.如果仅仅在开发调试的时候在本地部署跑起来是很容易的,不过要是生产环境,爬虫任务量大,并且持续时间长,那么还是建议使用专业的部署方法.主要是 ...