引用
oracle11g不支持使用 BYPASS_UJVC
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就会被更新多次而导致意想不到的结果。
分享到:
相关推荐
### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...
在使用Oracle Data Pump工具IMPDP(Import Data Pump)进行数据导入的过程中,可能会遇到ORA-39002和ORA-39070等错误。本文将针对这些错误的排查方法进行详细介绍,帮助用户理解问题的原因及解决策略。 ### 错误...
### 解决Drop Goldengate 用户时报ORA-00604 ORA-20782 ORA-06512问题 #### 一、问题背景与现象 在进行Oracle数据库管理过程中,经常会遇到需要删除用户的场景。当尝试执行`drop user goldengate cascade;`命令时,...
ORA-01654处理表空间不足问题 Oracle 数据库中,表空间不足是非常常见的...解决ORA-01654处理表空间不足问题需要通过查看表空间使用情况、查看表空间自动扩展功能、扩大原表空间大小或增加新的数据文件等方法来实现。
Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的一种分布式数据库管理系统,以分布式数据库为核心的软件产品。它具有完整的数据管理功能,作为一个关系数据库,它是一个非常实用的...
本文旨在详细介绍ORA-12518错误的成因、常见表现形式以及具体的故障排查方法,以帮助读者在实际工作中能够更高效地解决这一问题。 #### 目的 本文旨在探讨如何接近并解决ORA-12518/TNS-12518错误,并提供详细的...
通过以上方法,我们可以有效地解决ORA-29275错误,并提高Oracle数据库的整体稳定性和数据完整性。需要注意的是,在实际操作过程中,应当根据具体情况选择最适合的解决方案。例如,在某些情况下,调整字段长度可能是...
### Oracle 10g启动后报ORA-16038错误的解决方法 #### 错误概述 在启动Oracle 10g数据库时遇到ORA-16038错误,该错误通常与归档日志操作有关。具体错误信息为: ``` ORA-16038: log 1 sequence #230 cannot be ...
解决ORA-01145错误的方法如下: 1. **启用介质恢复**:对于需要进行离线操作的数据文件,首先应启用介质恢复。 2. **创建新的数据文件**:可以先创建一个新的数据文件来替换原有的数据文件,然后再执行离线操作。 3....
handlecollisions 参数用于处理目标库中的数据不一致问题。该参数可以解决更新、删除和插入操作中的数据不一致问题。handlecollisions 参数有三种情况: 1. 对于没有主键以及唯一索引的表,handlecollisions 参数...
### 创建物化视图ORA-12014错误解决方法 #### 背景介绍 在Oracle数据库中,物化视图(Materialized View)是一种用于优化查询性能的重要工具。它预先计算并存储了复杂的查询结果,从而在实际查询时能够快速地返回...
在处理二进制流数据时,可能会调用`PreparedStatement`的`setBlobAsBinaryStream`方法。需要注意的是,该方法在使用过程中也有可能触发ORA-01460错误。例如: ```java public abstract void setBlobAsBinaryStream...
### ORA-01033 错误解决方法 #### 概述 在数据库管理过程中,遇到诸如ORA-01033等错误代码是非常常见的。这些错误往往与数据库实例的状态、文件系统问题或是配置不当有关。ORA-01033 错误通常表示在启动或关闭...
### ora-01033: Oracle Initialization or Shutdown in Progress 解决方法 #### 一、问题背景及原因 **标题**: “ora-01033: Oracle initialization or shutdown in progress 解决方法” **描述**: “ora-01033: ...
4. **处理数据文件问题**: - 在mount状态下,如果遇到类似ORA-01157这样的错误,说明存在数据文件损坏或无法访问的情况。 - 可以通过将损坏的数据文件离线并删除(`alter database datafile 19 offline drop;`)...
ORA-01460错误全称为“ORA-01460: unimplemented unreasonable conversion requested”,主要出现在Oracle数据库中,当系统试图将一种数据类型转换为另一种无法处理的数据类型时触发。这种错误常见于数据导出(如...
在Oracle数据库操作中,"ORA-01480: STR 绑定值的结尾 Null 字符缺失"是一个常见的错误,通常与数据插入或更新时的格式问题有关。这个错误通常意味着在处理字符串数据时,Oracle无法找到预期的NULL终止符,这可能是...
从ORA-10000到ORA-19999的错误则涉及到更具体的数据库操作,如并发控制、事务处理和表空间管理。例如,ORA-12154表示无法解析服务名,这可能是TNS配置问题;ORA-14400是索引块损坏,可能需要使用RMAN或DB_REPAIR坏块...
### Oracle 断电导致控制文件不一致报错 ORA-00214 处理方法 #### 问题概述 在Oracle数据库管理过程中,遇到控制文件版本不一致的问题时,通常会收到ORA-00214错误提示。此错误表示数据库中的一个或多个控制文件与...