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

一、如果两张表有主键关系的话:

执行更新

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

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

分析

根据错误提示:”无法修改与非键值保存表对应的列”,初步推断为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: 无法修改与非键值保存表对应的列

结论:

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

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

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

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

二、如果两站表无任何关系

1.新建临时表

临时表数据来源为b表,给a表更新

数据结构有最少有主键id,和要更新的列

drop table temp_tt2;
create  GLOBAL TEMPORARY table tt2(
id number(10),
col1_b varchar2(10)
) ON COMMIT PRESERVE ROWS; 

2.不要忘了设置主键

alter table temp_tt2 add constraint pk_id_l primary key (id)

3.从tt2中插入数据到temp_tt2

insert into temp_tt2
select id,col1 from tt2

4.用临时表和a表关联进行批量更新

UPDATE (SELECT tt1.col1 ,temp_tt2 .col1_b,tt1.id,temp_tt2 .id FROM tt1,temp_tt2 WHERE  tt1.ID=temp_tt2 .ID)
SET col1=col1_b;

  

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

时间: 2024-10-12 04:28:44

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

sql server解决无法删除修改拥有外键约束的表或表的记录字段

sql server解决无法删除修改拥有外键约束的表或表的记录字段 问题如下: or 解决步骤: 1.找出该表的所有外键约束 select * from sys.foreign_keys where referenced_object_id=object_id('订单') order by 1 2.删除所有外键约束(注意外键的名字和表的名字分别是哪个!) alter table 订货项目 drop constraint FK__订货项目__订单编号__412EB0B6; 到这就可以把表删掉了~

RK3128平台android系统修改添加遥控器键值码值

最近帮客户定制RK3128平台的固件,涉及到定制新的遥控器,需要添加或修改遥控码值.RK3128平台android系统修改遥控器码值比全志A20.A31s稍微麻烦一些,其实本质是一样的.具体的修改方法如下: 1,先弄清楚遥控器的状况,包括遥控器用户码.键值对应的码值.方法:adb shell,输入echo1 >/sys/module/rockchip_pwm_remotectl/parameters/code_print, 再输入,cat /proc/ksmg,也可以通过串口搞. 遥控器对着灯板

电脑键盘键值对应表

详细的键值表: 常数名称 十六进制值 十进制值 对应按键 VK_LBUTTON 01 1 鼠标的左键 VK_RBUTTON 02 2 鼠标的右键 VK-CANCEL 03 3 Ctrl+Break(通常不需要处理) VK_MBUTTON 04 4 鼠标的中键(三按键鼠标) VK_BACK 08 8 Backspace键 VK_TAB 09 9 Tab键 VK_CLEAR 0C 12 Clear键(Num Lock关闭时的数字键盘5) VK_RETURN 0D 13 Enter键 VK_SHIFT

键盘键值对应表

字母和数字键 数字小键盘的键 功能键 其它键 键 键码 键 键码 键 键码 键 键码 A 65 0 96 F1 112 Backspace 8 B 66 1 97 F2 113 Tab 9 C 67 2 98 F3 114 Clear 12 D 68 3 99 F4 115 Enter 13 E 69 4 100 F5 116 Shift 16 F 70 5 101 F6 117 Control 17 G 71 6 102 F7 118 Alt 18 H 72 7 103 F8 119 Caps

第六章——根据执行计划优化性能(3)——键值查找

原文:第六章--根据执行计划优化性能(3)--键值查找 前言: 本文为本系列最后一篇,介绍键值查找的相关知识. 键值查找是具有聚集索引的表上的一个书签查找,键值查找用于SQLServer查询一些非键值列的数据.使用非聚集索引的查询不会有键值查找,但是所有键值查找会伴随非聚集索引出现.这里特别提醒的是键值查找总是伴有嵌套循环关联. 准备工作: 下面将创建一个表,通过执行计划看看键值查找的不同效果.为了产生键值查找,需要两件事情: 1.  聚集索引 2.  非聚集索引 当你在非聚集索引键值上有谓词时

NSMutableDictionary 用set方法初始化的字典 里边的键值不可修改

NSMutableDictionary 对象 用set方法初始化的键值不可修改,应为 NSMutableDictionary的set方法只是继承了NSDictionary的set方法,并没有重写该方法. 想要修改字典内容必须用NSMutableDictionary的alloc方法初始化.

Ubuntu - Dconf 注册表键值修改参考表

gsettings reset org.gnome.desktop.wm.preferences theme默认gnomegsettings set org.gnome.desktop.interface clock-show-date true顶部面板显示日期gsettings set org.gnome.SessionManager logout-prompt 'false'禁止注销重关机启延时gsettings set org.gnome.desktop.interface cursor-

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

好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch block,用以证明他的说法,从常理和SQL的语句执行信息就可以知道,他的说法是有问题的,但如何证明这一点呢?为了证明这点,也麻烦一次,玩玩多年不碰的dump.下面是他证明自己观点的两个dump结果(一个为单键索引,另一个是复合索引): 下面是本人的测试过程和结果: create table t1(c

swift基本用法-字典NSDictionary的定义,修改键值,删除/添加键值

// Playground - noun: a place where people can play import UIKit //------------------------------------------------------------------------------ // 1. 定义固定格式的字典 // dict1的所有"键值"类型一致(都是字符串) var dict1 = ["name": "mary", "a