原帖地址:http://blog.csdn.net/keyingbo2008/article/details/7679909
一、 update语句的语法与原理
1. 语法
单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
如:update t_join_situation set join_state='1'whereyear='2011'
更新年度为“2011”的数据的join_state字段为“1”。如果更新的字段加了索引,更新时会重建索引,更新效率会慢。
多表关联,并把一个表的字段值更新到另一个表中的字段去:
update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)
oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报
这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错。要解决这样必须保证查出来的值一一对应。
2. 原理
Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新。
如:update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)。查表a的所有数据,循环每条数据,验证该条数据是否符合exists(select 1 from 表b where a.字段2=b.字段2)条件,如果是则执行(select b.字段1 from 表b where a.字段2=b.字段2)查询,查到对应的值更新a.字段1中。关联表更新时一定要有exists(select 1 from 表b where a.字段2=b.字段2)这样的条件,否则将表a的其他数据的字段1更新为null值。
二、 提高oracle更新效率的各种解决方案
1. 标准update语法
当你需要更新的表是单个或者被更新的字段不需要关联其他表带过来,则最后选择标准的update语句,速度最快,稳定性最好,并返回影响条数。如果where条件中的字段加上索引,那么更新效率就更高。但对需要关联表更新字段时,update的效率就非常差。
2. inline view更新法
inline view更新法就是更新一个临时建立的视图。如:
update (select a.join_state as join_state_a,b.join_state as join_state_b from t_join_situation a, t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') set join_state_a=join_state_b
括号里通过关联两表建立一个视图,set中设置好更新的字段。这个解决方法比写法较直观且执行速度快。但表B的主键一定要在where条件中,并且是以“=”来关联被更新表,否则报一下错误:
3.merge更新法
merge是oracle特有的语句,语法如下:
MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);
它的原理是在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。执行merge不会返回影响的行数。Merge语句的写法比较繁琐,并且最多只能两个表关联,复杂的语句用merge更新法将力不从心且效率差。
4.快速游标更新法
语法如:
begin
for cr in (查询语句) loop –-循环
--更新语句(根据查询出来的结果集合)
endloop; --结束循环
end;
oracle支持快速游标,不需要定义直接把游标写到for循环中,这样就方便了我们批量更新数据。再加上oracle的rowid物理字段(oracle默认给每个表都有rowid这个字段,并且是唯一索引),可以快速定位到要更新的记录上。
例子如下:
begin for cr in (select a.rowid,b.join_state from t_join_situation a,t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') loop update t_join_situation set join_state=cr.join_state where rowid = cr.rowid; endloop; end;
使用快速游标的好处很多,可以支持复杂的查询语句,更新准确,无论数据多大更新效率仍然高,但执行后不返回影响行数。
三、结论
方案
建议
标准update语法
单表更新或较简单的语句采用使用此方案更优。
inline view更新法
两表关联且被更新表通过关联表主键关联的,采用此方案更优。
merge更新法
两表关联且被更新表不是通过关联表主键关联的,采用此方案更优。
快速游标更新法
多表关联且逻辑复杂的,采用此方案更优。
实时测试的速度:
--48466条数据
--1.297
update (select a.join_state as join_state_a,b.join_state as join_state_b from t_join_situation a, t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000' ) set join_state_a=join_state_b
--7.156
update t_join_situation a set a.join_state=(select b.join_state from t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') whereexists (select1from t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000')
--3.281
begin for cr in (select a.rowid,b.join_state from t_join_situation a,t_people_info b where a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') loop update t_join_situation set join_state=cr.join_state where rowid = cr.rowid; endloop; end;
--1.641
merge into t_join_situation a using t_people_info b on (a.people_number=b.people_number and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') when matched then update set a.join_state=b.join_state
相关推荐
在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...
本文将深入探讨如何优化Oracle数据库中的UPDATE语句,以提高数据库效率。 一、使用绑定变量 绑定变量是一种优化策略,它允许多次执行同一UPDATE语句时,只解析一次SQL。这样可以避免因每次更新不同值时都解析新SQL...
### Update语句优化 在数据库操作中,`UPDATE`语句是用于修改现有记录的关键工具之一。对于大型数据库系统来说,优化`UPDATE`语句能够显著提升数据处理速度和效率,减少资源消耗,提高整体性能。本文将通过分析提供...
在Oracle数据库中,多表关联的UPDATE语句用于更新一个表中的数据,这些数据依赖于另一个或多个表的记录。这种操作在数据整合、错误修正或者数据同步时非常常见。以下我们将详细探讨如何使用不同方式执行多表关联的...
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...
Oracle数据库作为企业级应用中的核心组件,其`UPDATE`语句的语法和性能优化策略对于提升系统的整体效率至关重要。本文将深入探讨Oracle中`UPDATE`语句的几种常见用法,以及在不同场景下如何进行性能分析和优化。 ##...
在数据库管理中,UPDATE语句用于修改已存在的数据记录,而SELECT语句则用于查询数据。在某些场景下,我们可能需要从UPDATE语句转换为SELECT语句,以验证更新操作将影响哪些行或者理解更新逻辑。这在调试、数据分析或...
今天,我们将讨论 Oracle 中的 Update 语句,包括 Update 语句的基本语法、Update 语句中使用 Select 语句、Update 语句中使用 Join 语句、Insert 语句的使用等。 一、Update 语句的基本语法 Update 语句的基本...
### 生成UPDATE语句 本篇文章将详细介绍如何根据指定的表结构来生成更新语句(UPDATE SQL),并特别关注基于主键更新的情况。这在Oracle数据库管理与开发中是一项非常实用的技术,尤其对于那些需要频繁更新数据库...
在Oracle数据库中,UPDATE语句是用于修改已存在数据的基本操作之一。在上述示例中,我们看到三种不同的UPDATE语句形式,它们各自处理特定的情况并具有不同的性能特点。 1) **最简单的形式**: 这种情况下,我们更新...
更新语句的优化研究是数据库性能优化的重要组成部分。本文将详细介绍 Oracle 更新语句的五种方式,并对每种方式的优缺点进行分析。 一、标准 Update 语句 标准 Update 语句是 Oracle 中最基本的更新语句,语法为:...
标题中的“update语句”指的是在数据库管理中用于修改现有数据的SQL命令。在数据库操作中,`UPDATE`语句是不可或缺的一部分,它允许我们更改表中的特定行或所有行的数据。下面将详细介绍`UPDATE`语句的工作原理、...
Oracle语句优化是数据库管理中的关键任务,目的是提高SQL查询的效率,减少资源消耗,提升系统性能。以下是一些核心的Oracle语句优化规则: 1. **选择合适的优化器**: - ORACLE提供三种优化器:基于规则(RULE)、...
Oracle SQL语句是数据库管理与数据查询的重要工具,尤其在Oracle数据库系统中,掌握SQL的高效使用至关重要。这个"oracle sql语句学习"资源包显然旨在帮助初学者逐步提升到高级水平,通过全面的笔记资料,使用户能够...
Oracle 查询语句大全-精华版 Oracle 查询语句大全是 Oracle 数据库管理系统中最基本也是最重要的组成部分,用于管理和维护数据库。本文将详细介绍 Oracle 查询语句的使用方法和实践操作。 一、创建用户和授权 在 ...
### 数据库Oracle锁:FOR UPDATE OF与FOR UPDATE的区别 在Oracle数据库中,为了确保数据的一致性和准确性,尤其是在多用户环境中进行并发操作时,锁机制是必不可少的一部分。本文将详细介绍`FOR UPDATE`与`FOR ...
在数据库优化的研究领域中,Oracle数据库作为业界广泛使用的数据库系统,其SQL查询语句的优化研究对于提高数据库系统的整体性能具有重要的现实意义。本文旨在探讨基于Oracle数据库SQL查询语句的优化规则,并通过实际...
Oracle 常用 SQL 语句汇总 Oracle 是一个功能强大且复杂的关系数据库管理系统,它提供了多种 SQL 语句来管理和操作数据库。在本文中,我们将详细介绍 Oracle 中常用的 SQL 语句,包括数据控制语句(DML)、数据定义...