原文地址: http://hi.baidu.com/jianxh/blog/item/34b687de1a34535695ee37c2 . html

Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为:

ORA-01779: cannot modify a column which maps to a non-key-preserved table

例如,使用以下的更新查询就会出现该错误。

CREATE TABLE test1 ( id integer primary key, num integer );
INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0);
CREATE TABLE test2 ( id integer, num integer, upd integer );
INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1);
UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2; ORA-01779: cannot modify a column which maps to a non-key-preserved table

这个错误的意思是,子查询的结果中,更新数据源(test2)的内容不唯一,导致被更新对象(test1)中的一行可能对应数据源(test2)中的多行。 本例中,test2表的id不唯一,因此test2表中可能存在id相同但是num不相同的数据,这种数据是无法用来更新 test1 的。

解决方法就是保证数据源的唯一性,例如本例中可以为test2.id创建一个唯一索引:

CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);

之后上面的更新就可以执行了。

另外也可以强制 Oracle 执行,方法是加上 BYPASS_UJVC 注释。

UPDATE
( SELECT /*+ BYPASS_UJVC */ t1.id id1, t1.num num1, t2.id id2, t2.num num2
FROM test1 t1, test2 t2
WHERE t1.id=t2.id AND t2.upd=1 )
SET num1=num2;

BYPASS_UJVC的作用是跳过Oracle的键检查。 这样虽然能够执行了,但是如果test2中存在不唯一的数据,test1就会被更新多次而导致意想不到的结果。

错误 报告 - SQL 错误 : ORA - 01779 : 无法修改与非键值保存表对应的列 01779 . 00000 - "cannot modify a column which maps to a non key -pre served table " *Cause: An attempt was made to insert or update column s of a join view which map to a non - key -pre served table . 上周在做视图更新的时候,报了一个错: ORA - 01779 : 无法修改与非键值保存表对应的列。 官方文档是这么解释的: ORA - 01779 cannot modify a column which maps to a non key -pre served table 解决 这个问题的关键在于搞清楚什么是 Key -Pre served Table s? 上面是官方文档的解释。大致意思:搞清楚 key -pr... Oracle 中试图对一个子查询进行更新时可能会出现 ORA - 01779 错误 。该 错误 的内容为: ORA - 01779 : cannot modify a column which maps to a non - key -pre served table 例如,使用以下的更新查询就会出现该 错误 。CREATE TABLE test1 ( id integer primary key , num 最近同事问我一个问题,是关于一个update语句的问题,需求有点特别,结果在使用update语句尝试了各种方法后,仍然是不依不饶的报出 ORA - 01779 错误 。今天专门花时间分析了一下这个问题,还是有些收获。 为了说明问题,我... 上周在做视图更新的时候,报了一个错: ORA - 01779 : 无法修改与非键值保存表对应的列。为了 解决 这个问题,浏览了很多人的博客,大多数都只是举了一个例子,而没有说出本质问题在哪,不如看官方文档更加清晰透彻。只有这篇博客非常深入地探讨了这个问题,大家可以阅读一下:从 ORA -01752的 错误 ,透过现象看本质 ORA - 01779 cannot modify a column which maps to a... 写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master Oracle 的update语句问题:update config t set t.value =1 where t. key ='DB_... Oracle 中试图对一个子查询(VIEW)进行更新时可能会出现 ORA - 01779 错误 。该 错误 的内容为: ORA - 01779 : cannot modify a column which maps toa non - key -pre served table 例如,使用以下的更新查询就会出现该 错误 。CREATE TABLE test1 ( id integer primary key , num integer)... 为了避免在使用MyBatis的严格校验输入数据的有效性,防止非法字符注入。在构造动态SQL时遵循正确的语法规范,特别是对于字符串和数值类型的处理。明确参数映射规则,确保MyBatis能够正确解析和绑定参数。