原文地址:
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能够正确解析和绑定参数。