INSERT INTO tt1 VALUES(1,'tt1id1');
INSERT INTO tt1 VALUES(2,'tt1id2');
INSERT INTO tt2 VALUES(1,'tt2id1');
INSERT INTO tt2 VALUES(2,'tt2id2');
INSERT INTO tt1 VALUES(3,'tt1id3');
INSERT INTO tt2 VALUES(4,'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: 无法修改与非键值保存表对应的列
根据错误提示:”无法修改与
非键值保存表
对应的列”,初步推断为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表数据时才有意义(自己都不确定怎么影响别人,是吧,hehe),
当然,如果两表关联的字段都为主键,则无论谁更新谁都没有问题。
结论:用A表数据更新B表数据,则A与B的对应关系为:1:1 或 1:n。
项目中通过子查询更新数据时遇到ORA-01779: 无法修改与非键值保存表对应的列,模拟过程如下:1、创建测试表 CREATE TABLE tt1 (ID INT,col1 VARCHAR2(20)); CREATE TABLE tt2 (ID INT,cola VARCHAR2(20));2、录入测试数据 INSERT INTO tt1 VALUES
ORA
-12154:TNS:
无法
解析指定的连接标识符
ORA
-12154:TNS:无监听程序
错误分析一、PL/SQL 客户端登录到数据库,如果配置错误会有以上错误,如下图。
这个错误主要是pl/sql客户端的tnsnames.
ora
配置错误,或者是输入 database选项错误。
错误分析二、未配置环境变量
所以解决问题之前一定要配置环境变量TNS_ADMIN
path添加;E:\PLSQL Developer(64)\instantclient_11_2
配置环境变量就是为了让PL/SQL Developer打开时加载到tnsnames.
ora
文件的内容
配置pl/sql的Datab
你要插入的
表
A里,有外键连接到另一个
表
B的主键,你在
表
A的外键
列
插入的值,在
表
B的主键
列
找不到就不能插入。
主要看两
表
中的数据是否一致,从
表
中要关联外键的字段中的数据必须包含在主
表
相关字段的数据内。
处理的方法有:
1> 先不验证已有数据的CONSTRANT,加上参数NOVALIDATE.*/
今天遇到一个错误:
ORA
-
01779
:
无法
修改
与非
键值
保存
表
对应
的
列
。
后来发现,当要对一个基于多
表
连接的视图进行插入,更新等操作时,容易出现这个错误。
解决办法:个人认为,这个视图不能操作,可以对它基于的
表
进行操作,这样,该视图里也就有相应数据了。
于是,做了下面这个实验。
SQL> create
table
emp2 as select * from emp;
表
已创建。
ORA
-01261和
ORA
-01262是
Oracle
数据库中的错误代码,通常与控制文件相关。
ORA
-01261
表
示控制文件中的记录已经过时,
无法
使用。这可能是由于控制文件已经被删除或损坏,或者是由于数据库实例
无法
访问控制文件。
ORA
-01262
表
示控制文件中的记录已经被
修改
,
无法
使用。这可能是由于控制文件已经被其他进程
修改
,或者是由于数据库实例
无法
访问控制文件。
要解决这些错误,可以尝试恢复控制文件,或者使用备份控制文件替换当前的控制文件。还可以检查数据库实例的权限和文件系统的可用空间,以确保数据库实例可以访问控制文件。
--创建临时表解决了
drop table TEMP_01;
create table TEMP_01(dialog_id varchar2(38) primary key ,sort_id varchar2(38),sort_name varchar2(100));
insert into TEMP_01
select t.id,t.mutual_sort_top_id as id2,sy.sort_name as name2
from dialog t inner join rqm_cfg_systemsort sy on t.MUTUAL_SORT_TOP_ID=sy.id;
commit;
update (select hi.mutual_sort_top_id as id1, hi.mutual_sort_top_name as name1,
t.sort_id as id2,t.sort_name as name2
from JCZC_BPMTASK hi inner join TEMP_01 t on hi.dialogid =t.dialog_id
set id1=id2,name1=name2;
commit;
[/code]