ORA-01779: 无法修改与非键值保存表对应的列
项目中通过子查询更新数据时遇到ORA-01779: 无法修改与非键值保存表对应的列,模拟过程如下:
1、创建测试表
1 CREATE TABLE tt1 (ID INT,col1 VARCHAR2(20)); 2 CREATE TABLE tt2 (ID INT,cola VARCHAR2(20));
2、录入测试数据
1 INSERT INTO tt1 VALUES(1,'tt1id1'); 2 INSERT INTO tt1 VALUES(2,'tt1id2'); 3 INSERT INTO tt2 VALUES(1,'tt2id1'); 4 INSERT INTO tt2 VALUES(2,'tt2id2'); 5 INSERT INTO tt1 VALUES(3,'tt1id3'); 6 INSERT INTO tt2 VALUES(4,'tt2id4'); 7 COMMIT;
3、执行更新
1 UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) 2 SET col1=cola;
报错:ORA-01779: 无法修改与非键值保存表对应的列
4、分析
根据错误提示:”无法修改与非键值保存表对应的列”,初步推断为tt2中没有主键?
那么在tt2上添加主键后再更新试试
1 ALTER TABLE tt2 ADD CONSTRAINT pk_tt2_id PRIMARY KEY(ID); 2 3 UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) 4 SET col1=cola;
发现可以成功更新数据。
然后将在tt2上加的主键删除,再在tt1上添加主键试试,
1 ALTER TABLE tt2 DROP CONSTRAINT pk_tt2_id; 2 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。