转贴:http://rainbowbridg.itpub.net/post/23663/295750
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就会被更新多次而导致意想不到的结果。
分享到:
相关推荐
5. **错误处理**:支持异常处理机制,能够捕获并处理数据库操作中的错误。 6. **兼容性**:兼容多种Oracle数据库版本,能够在不同版本之间灵活切换。 ### 关键知识点五:cx_Oracle与Python版本的兼容性 根据文件名...
对于批量插入或更新操作,JDBC提供了BatchUpdateException和addBatch()方法,可以提高效率。 总结,JDBC驱动是Java与SQLserver、Oracle、MySQL等数据库通信的关键组件。理解JDBC的工作原理,掌握其核心API的使用,...
7. **异常处理**:`cx_Oracle`中定义了一些特定的异常类,如`cx_Oracle.Error`、`cx_Oracle.IntegrityError`等,通过`try/except`语句捕获和处理异常。 8. **游标对象的高级特性**:`cx_Oracle`的游标对象还支持预...
- **编写PL/SQL**:了解如何创建、修改和执行存储过程、函数,以及处理异常和事务管理。 - **游标和集合**:在PL/SQL中,游标用于逐行处理查询结果,而集合则用于批量操作数据。 7. **数据库性能监控**: - **V$...
6. **异常处理**:在使用cx_Oracle时,应妥善处理可能出现的数据库错误,如`cx_Oracle.Error`异常。 ```python try: # 执行可能抛出异常的代码 except cx_Oracle.Error as e: print("Error:", e) ``` 7. **游标...
- **通过游标更新数据**:批量处理数据。 - **游标变量**:存储游标的引用。 - **给PACKAGE加密**:保护敏感的存储过程和函数。 - **Oracle Advanced Queue**:用于消息队列的应用程序接口。 - **跨数据库的SQL...
Oracle存储过程也能用于批量更新操作,如创建`batchUpdateStudent`这样的过程,接收参数并在数据库中执行更新。这种方式比逐行更新更有效率,减少了网络通信和数据库事务处理的时间。 总的来说,Oracle存储过程是...
Oracle 9i数据库是一款强大的关系型数据库管理系统,广泛应用于企业级数据存储和处理。本教程将深入探讨如何操作Oracle 9i,包括安装、配置、数据管理、查询优化以及故障排查等多个方面。以下是对这些关键知识点的...
案例源自一次数据库安全检查过程中,发现了一条SQL语句执行异常缓慢,并引发了ORA-01555错误。通过对Statspack报告的分析,该SQL语句占据了大量数据库缓存空间,表明其执行效率低下,需要进行优化。 #### 原始SQL...
这一章会介绍PL/SQL的基本语法、变量声明、控制流程语句,以及异常处理机制。 第5章:表和索引 详细讲解Oracle中的表结构,包括字段定义、约束条件以及表间的关系。同时,探讨索引的作用、类型(B树、位图等)以及...
### OracleEBS开发汇总文档知识点概述 #### 一、Oracle EBS开发概述 **OracleEBS(Enterprise Business Suite)**是一套完整的业务解决方案,旨在帮助企业管理财务、供应链、人力资源等核心业务流程。对于EBS的...
Oracle SQL脚本可以帮助用户进行数据的高效处理,如创建表、建立索引、执行批量数据导入导出等。通过学习和运用这些脚本,可以极大地提升数据库管理效率。 PL/SQL,即Procedural Language/SQL,是Oracle特有的过程...
《Ora9iSQL参考手册》是一份针对Oracle 9i数据库系统中SQL语言的权威指南,它详尽地阐述了在Oracle环境下如何使用SQL进行数据管理、查询、更新和事务处理等一系列操作。这份手册是数据库管理员、开发人员以及对...
5. **处理异常**: 当使用ODP.NET时,需要捕获并处理可能的Oracle异常,例如`OracleException`,确保程序健壮性。 6. **安全考虑**: 避免在代码中硬编码敏感信息,如用户名和密码。可以使用配置文件或环境变量存储...
掌握PL/SQL的语法和异常处理机制,可以实现更复杂的数据处理逻辑。 这些内容涵盖了Oracle9i基础和Oracle SQL的核心知识点,通过深入学习和实践,你可以成为一个熟练的Oracle数据库管理员或开发者。文件列表中的...
6. **故障诊断与修复**:如何识别和解决常见的错误和异常,如ORA-错误代码的解读,以及如何利用trace文件和alert log进行问题定位。 7. **高可用性与容灾**:讲解RAC(Real Application Clusters)技术,实现数据库...
Oracle数据库管理中,删除用户和表空间是常见的维护任务,特别是在开发环境中...总之,Oracle数据库的用户和表空间管理是一项细致的工作,需要对数据库结构有深入理解,并在操作时保持谨慎,以防止数据丢失或系统异常。